C #: изменить тип данных извлечения для Entity Framework - PullRequest
8 голосов
/ 08 марта 2012

Я пытаюсь преобразовать проект, который в настоящее время использует пользовательскую платформу 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 после получения ответа.В идеале я хотел бы сделать это для каждого класса.

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

1 Ответ

5 голосов
/ 08 марта 2012

Хотя вы можете неявно приводить bigint к int в SQL Server , создается впечатление, что типы EDM платформы Entity (что на самом деле имеет дело с вами) не позволяютнеявное преобразование из 64-битного целочисленного типа в 32-битный целочисленный тип.

Это, вероятно, по веской причине, поскольку вы можете легко переполниться и иметь значения, которые не помещаются в поля int.

При этом у вас должно быть два базовых класса, один для int ID и один для long ID.Это не красиво, но навязывает логику, которую вы определенно хотите;вы не сможете хранить в базе данных значения, превышающие то, что может поместиться в int, так почему вы хотите иметь возможность делать это на уровне кода?Платформа Entity делает все правильно, не позволяя вам применить это преобразование.

...