Используя 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, поэтому дополнительные свойства могут быть выброшены, но компилятор не разрешает приведение к базе.
Что выпредложить?