C#: изменение типа данных извлечения для Entity Framework

Я пытаюсь преобразовать проект, который в настоящее время использует пользовательскую структуру DAO, в использование Entity Framework. Система довольно большая, поэтому изменения в самой базе данных (SQL Azure DB, если это имеет значение) не особенно осуществимы, и их следует по возможности избегать.

Проблема связана со столбцом ID. К сожалению, когда система была создана, некоторые таблицы имели тип данных bigint, а некоторые — int, но все сами модели происходят из базового класса, имеющего long для идентификатора. Предыдущий фреймворк мог справиться с этой ситуацией, но мне не удалось найти способ сделать это с помощью фреймворка сущностей.

Ниже приведен самый простой пример, который я могу придумать:

public class Context : DbContext {
    public IDbSet<Foo> Foos {get;set;}
    public IDbSet<Bar> Bars {get;set;}
}
public abstract class BaseClass {
    public long ID;
}
public class Foo : BaseClass {
    ...
}
public class Bar : BaseClass {
    ...
}
SQL Table: Foo
+-------------+
| id : bigint |
| ...         |
+-------------+
SQL Table : Bar
+-------------+
| id : int    |
| ...         |
+-------------+

Когда я пытаюсь загрузить модель Bar, я получаю следующую ошибку:

The 'ID' property on 'BaseClass' could not be set to a 'Int32' value. You must set this property to a non-null value of type 'Int64'.

Я хотел бы найти способ сказать система, в которой у Bar есть целые числа, а у Foo — длинные. Я попытался переопределить OnModelCreating в контексте и определить HasColumnType для Bar.Это дало мне новую ошибку:

Schema specified is not valid. Errors:
    (105,12) : error 2019: Member Mapping specified is not valid. The type 'Edm.Int64[Nullable=False,DefaultValue=]' of member 'ID' in type 'Bar' is not compatible with 'SqlServer.int[Nullable=False,DefaultValue=,StoreGeneratedPattern=Identity]' of member 'ID' in type 'CodeFirstDatabaseSchema.Bar'.

Мне кажется, что если бы я мог только изменить ожидаемый тип данных для ID из BaseClass на int до отправив запрос на сервер, я смогу преобразовать его в long после получения ответа. В идеале я хотел бы сделать это для каждого класса.

Кто-нибудь может указать мне правильное направление?

8
задан Merwer 7 March 2012 в 21:12
поделиться