Я работаю над проектом с помощью платформы объекта. Это должно хорошо использовать частичные классы сгенерированных классов EF как бизнес-слой. Я начинаю думать, что это - то, как EF предназначается, чтобы использоваться.
Я попытался использовать шаблон DTO и скоро понял, что просто создаю набор отображающихся классов, который копирует мое усилие и также причину для большего количества работ по техническому обслуживанию и дополнительного слоя.
Я хочу использовать self-tracking-entities и передать объекты EF всем слоям. Совместно используйте свои мысли и идеи.Спасибо
Я бы не стал этого делать по следующим причинам:
Однако, если у вас есть код, специфичный для модели данных, поместите его в частичный класс, чтобы избежать его потери при повторном создании модели.
Я думаю, что частичный класс будет хорошей идеей. Если модель будет регенерирована, то вы не потеряете бизнес-логику в частичных классах.
В качестве альтернативы вы также можете рассмотреть EF4 Code only, чтобы не генерировать модель из базы данных.
Я бы не стал этого делать. Старайтесь, чтобы слои были как можно более независимыми. Так что крошечное изменение в схеме вашей базы данных не повлияет на все ваши слои.
Сущности могут быть использованы для слоя данных, но не должны. Если это вообще возможно, предоставьте интерфейсы для использования и позвольте вашим сущностям реализовать их (в частичном файле), BL не должен знать сущности, а только интерфейсы.
Я бы использовал частичные классы. В DDD-коде нет такого понятия, как уровень данных. Есть уровень данных, и он находится на SQL Server. Код приложения должен содержать только бизнес-уровень и некоторые сопоставления, которые позволяют сохранять бизнес-объекты на упомянутом уровне данных.
Entity Framework - это ваш код доступа к данным, поэтому вам не следует создавать свой собственный.В большинстве случаев схема базы данных будет изменена из-за изменения модели, а не наоборот.
Сказав это, я бы не рекомендовал вам делиться своими сущностями на всех уровнях. Я ценю разделение пользовательского интерфейса и уровня предметной области. Я бы использовал DTO для передачи данных в домен и из него. Если бы у меня была необходимая свобода, я бы даже использовал шаблон CQRS, чтобы избавиться от сопоставления сущностей с DTO - я бы просто создал второй проект доступа к данным EF, предназначенный только для чтения данных для пользовательского интерфейса. Он будет построен на основе той же базы данных. Вы читаете данные с помощью модели чтения (анемичной - без бизнес-логики), но вы изменяете ее, вводя команды, которые выполняются для реальной модели, реализованной с использованием EF и частичных методов.
Это ответ на ваш вопрос?
Я рассмотрел возможность использования частичных классов и обнаружил, что раскрытие модели базы данных вплоть до уровня пользовательского интерфейса будет ограничивающим.
По нескольким причинам:
Если вы занимаетесь TDD и следуете YAGNI, то у вас будет структура, специально разработанная для операции, которую вы пишете, и на которую будет легче строить тесты (не требуя создавать другие объекты, не относящиеся к тесту, только потому, что они есть в модели). В этом случае вы можете иметь...
public class Order
{ ...
public Guid CustomerID { get; set; }
... }
Вместо того чтобы использовать модель сущности, сгенерированную EF, которая имеет открытые ссылки...
public class Order
{ ...
public Customer Customer { get; set; }
... }
Таким образом, идентификатор клиента нужен только для операции, которая принимает заказ. Зачем вам создавать Customer
(и потенциально другие объекты) для операции, которая занимается приемом заказов?
Если вы беспокоитесь о дублировании и отображении, то посмотрите на Automapper