Почему Entity Framework генерирует сущности как частичные классы? - PullRequest
4 голосов
/ 15 июня 2011

Другие используемые мной ORM, такие как Torque, Propel или Doctrine, генерируют 2 класса для каждой сущности: например, BaseCustomer и Customer . Клиент наследуется от BaseCustomer , и вы можете переопределить методы или добавить свои собственные.

Но Entity Framework генерирует частичные классы.Вы можете добавить методы, но не переопределить их (методы конструктора или метода доступа).

Почему это так?

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

не является ли это недостатком EF, поскольку он ограничивает свободу разработчиков?

Ответы [ 3 ]

3 голосов
/ 15 июня 2011

Генерация кода по умолчанию для EF как есть.Вы не можете изменить прямое поведение.Вы можете добавить свое собственное поведение только в частичные классы.С конструктором проблем нет, потому что, как я знаю, EF не создает конструктор для сущностей - он использует конструктор по умолчанию.

В EF 4 все это сильно изменилось.Вы можете отключить генератор сущностей по умолчанию и использовать вместо него шаблон T4.Шаблон T4 - это просто еще один файл сценария, который вы можете изменять и добавлять любые необходимые изменения.

Если вы хотите получить лучшее объяснение, почему это делается таким образом, вам следует обратиться к команде ADO.NET, но обычно частичные классы являются распространенным способомиметь дело с сгенерированным кодом во всей среде .NET, поэтому они, вероятно, сохраняют его для согласованности.

2 голосов
/ 15 июня 2011

Наследование обычно злоупотребляет и фактически ограничивает не только частичные классы.Как принцип разработки, классы должны быть открыты для расширений, а частичные классы работают лучше, чем унаследованные классы.

Что касается переопределения автоматических свойств / методов сущностей, вы всегда можете использовать ключевое слово new (если вы используете C #):

public MyCustomer : Customerbase {
    public new string FirstName { ... }
}

Однако любой класс, унаследованный от MyCustomer, по умолчанию вернется к FirstName из Customer.

0 голосов
/ 15 июня 2011

Я не могу придумать особенно вескую причину для переопределения метода или свойства в EF.Если вы не хотите, чтобы конкретное свойство присутствовало, и хотите предоставить свое собственное, не включайте его в модель сущности.Я признаю, что конструктор немного больше беспокоит, хотя вы можете обойти его с помощью фабричного метода, который делает то, что вы хотите.

Я предполагаю, что у всех проектных решений есть компромиссы - я работал сПродвигать и как его модель также, в этом контексте.EF, похоже, хорошо соответствует парадигме .NET, и я нашел, что частичные классы «достаточно хороши» для расширения сущностей, когда мне нужно это сделать.

...