Считаете ли вы, что делать Документы предприятие аннотация?
С стороны БД у вас будет Документы таблица, содержащая только поля, разделяемые всеми счетами-фактами/итомами. В этом поле будет IDENTITY PK - например DocId.
В других таблицах, дополнительные мета-данные, специфичные для данного документа могут быть сохранены, а ПК является (нетождества) поле DocId, который также является ФК к Документы таблицы.
На стороне EF, Документов становится абстрактной сущности и другие объекты наследуют от этого объекта. Это позволяет создать хорошую парадигму ОО и сделать ваш код более надежным.
В настоящее время мы используем эту схему (EF4/SQL Server).
Ваш сценарий звучит очень похоже на наш - рассмотрим использование абстрактных классов.
EDIT
Мысль я хотел бы добавить немного больше информации о том, как я на самом деле реализован этот сценарий, чтобы поставить вас на правильном пути.
Как комментарии к вашему состоянию Q, у нас мало знаний о вашем домене, поэтому сложно сделать обоснованные мнения. Лично я решил сделать свой объект аннотация, потому что для некоторых функций требовалось «смешанная сумка» предметов, которые нужно вернуть за один удар. Конечно, есть другие способы сделать это (например, хранимая процедура), но это позволяет хорошо владеть интерфейсом между моим пользовательским интерфейсом (кстати, MVC) и моим уровнем обслуживания.
как это работает - вот как я получаю одного Сообщение:
// var is strongly-typed to a "Post"
var somePost = repository.FindSingle(10);
Вот как я получаю смешанный мешок сообщений:
// var is strongly-typed to a "ICollection<Post>".
// "Title" is a property on my "Post" abstract POCO
var mixedBagOfPosts = repository.FindAll<Post>(p => p.Title = "Some Title");
Вот как я получаю сборник «Обзоры» (ребенок почты):
// var is strongly-typed to a "ICollection<Review>"
// "Rating" is a property on my "Review" POCO (derived from Post)
var reviews = repository.FindAll<Review>(r => r.Rating == 5.00);
Кикер мое хранилище осуществляется с обобщениями, а параметр типа обеспечивает безопасность типов:
ICollection<T> FindAll<T>(Expression<Func<T,bool>> predicate) where T : Post
И это реализовано так:
return myContext.Posts.OfType<T>.Where(predicate).ToList();
OfType вызывает внутреннее соединение в T (который является дочерней таблицей), поэтому возвращаются только те записи.
Конечно, у меня также есть служебный уровень , посредник между моим пользовательским интерфейсом и репозиторием, но это должно помочь вам на правильном пути.
Кроме того, вам не нужно идти со всей экспрессией-предикатом, мне это нравится, потому что это сводит к минимуму количество методов на моем интерфейсе и дает полную мощность запроса моим контроллерам, в то же время обеспечивая запросы отложили до уровня обслуживания, но не дальше.
Если вам это не нравится, вы можете, конечно, иметь регулярные параметры (название строки и т. Д.).
Как я уже сказал, эта архитектура подходит для моих требований к домену, поэтому может не соответствовать вашим требованиям, но, надеюсь, это дает вам некоторое представление.
Имейте в виду, что вашей модели не нужно подражать вашей базе данных/таблицам. На самом деле одним из преимуществ модели является то, что она может представлять домен более тесно, чем макет базы данных. Просто потому, что вы нормализуете что-то в базе данных, это не значит, что он наследует от того же класса на модели. Обычно это неправильный подход. Если единственное, что существует между некоторыми вашими объектами, состоит в том, что все они имеют 5 общих свойств, но очень разные правила и поведение, вы можете подумать о том, что они являются независимыми классами, а не наследуют форму одного и того же корня. –
Это правильный вопрос, Гектор, но я стараюсь балансировать между лучшими практиками и простотой дизайна. Похоже, что два принципа: «Разделение забот» и «СУХИЕ» («Не повторяй себя») часто противоречат самим себе. – mare
Я не уверен, что кто-нибудь здесь может дать вам инструкции о том, как правильно создать свой доменный уровень. Это может сделать только человек с полным пониманием бизнеса. Это ваш первый раз, когда вы делаете дизайн, ориентированный на домен? Вы сделали OO в прошлом?Мой опыт работы с Stackoverflow заключается в том, что группа здесь отлично подходит для ответа на вопросы с жесткой сферой, но не столько для широких потребностей. Я бы посоветовал, если вы впервые разрабатываете доменный уровень, чтобы получить помощь от коллеги или сделать некоторые чтения по этому вопросу. – bzarah