Я пытаюсь преобразовать проект, который в настоящее время использует пользовательскую платформу DAO, в Entity Framework.Система достаточно велика, поэтому изменения в самой базе данных (в случае необходимости, в базе данных SQL Azure) не особенно осуществимы, и их следует избегать, если это возможно.
Проблема связана со столбцом 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
после получения ответа.В идеале я хотел бы сделать это для каждого класса.
Может ли кто-нибудь указать мне правильное направление?