Пользовательские преобразования в или из базового класса и сущности-каркаса - PullRequest
0 голосов
/ 18 февраля 2011

Используя entity framework (EF) в качестве инструмента ORM в трехуровневом проекте, я обнаружил, что сгенерированный структурой сущности код выглядит как DAL + немного BLL.Поскольку DAL и BLL - это разные слои в этом сценарии, и для каждого из них будут работать разные кодеры, необходимо разделить каждый слой как отдельный проект.

Проблема в том, что я неЯ не хочу изменять EF сгенерированный код и все еще нуждаться в дополнительном проекте для BLL (я знаю о EF частичных классах и On...Changing() methods, но это не имеет смысла для хорошего разделения понятий для меня, а также частичногокласс не может быть реализован в другом проекте).

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

Затем я подумал об обертывании сгенерированных классов структуры сущностей с нашимиКлассы BLL (производные BLL классов от EF классов) и добавление туда дополнительной логики BLL (проверки, бизнес-правила ...) и скрытие базовых методов и свойств с BLL эквивалентами.

// example of a new property which facilitates using an EF object

class EFaccount // EF generated class
{
   DateTime CreationDate { get; set; }
   DateTime ExpiranDate { get; set; }
}

class BLLaccount : EFaccount // BLL class
{
   new DateTime CreationDate { get; set; }
   new DateTime ExpiranDate { get; set; }
   // Total age in days as a new property. Storing this, in dbase cause unnecessary redundancy
   int Days { get { return (ExpirationDate - CreationDate).TotalDays; } }
}

Так как BLL классы являются производными от их эквивалентных EF классов, мне нужно привести из базового класса и обратно в него, что недопустимо.

В моем случае, если я приведу из EF в BLL это означает, что объект исходит из dbase, а дополнительные свойства могут быть легко вычислены из базового класса, но компилятор не разрешает приведение из базового класса.И если я приведу от BLL к EF, это означает, что объект будет сохранен в базе данных dbase, поэтому дополнительные свойства могут быть выброшены, но компилятор не разрешает приведение к базе.

Что выпредложить?

1 Ответ

0 голосов
/ 18 февраля 2011

Предложение:

  • Использование Entity Framework 4
  • Использовать Entity Objects или предпочтительно POCO
  • Использовать объектные объекты или шаблон POCO T4
  • Измените шаблон T4, чтобы добавить для вас дополнительные функции - возможно создание и реализация интерфейса на основе свойств объекта.

Аргумент, что вы не хотите дополнительных кодировок, смешен. Вы уже доказали, что сгенерированный код требует много дополнительных кодировок, и у вас много дополнительных сложностей. Создано не значит хорошо. Нелегко работать с сгенерированным кодом, если вы не можете изменить его генерацию (это возможно, только если вы напишите свой собственный инструмент для генерации кода). Итак, вот явное преимущество шаблонов T4.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...