Entity Framework 4 Code First Fluent Конфигурация API для отношений один-к-одному с наследованием - PullRequest
2 голосов
/ 15 декабря 2011

Я пытаюсь реализовать шаблон домена "Party", используя сначала EF Code с Fluent Configuration для всех моих бизнес-классов. Конфигурация заставляет меня пить (не обязательно плохо, но следующая остановка - скала)

То, что я хотел бы, - это что-то вроде кода, показанного ниже. Требования к базе данных таковы, что я получаю следующие таблицы:

Отдельная таблица "Стороны" Отдельная таблица "Люди" Отдельная таблица "Организации"

Таблица людей имеет обязательные отношения один-к-одному с таблицей сторон, т. Е. Перед тем, как иметь человека, у вас должна быть Сторона.

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

И все бизнес-объекты наследуются от базового класса BusinessObject, который не должен попадать в базу данных, т. Е. Только для наследования свойств.

Я хочу использовать подход Code First / Fluent API с использованием классов EntityTypeConfiguration, т. Е. У меня есть следующие классы для настройки:

  1. Контекстный класс для настройки конфигурации.
  2. Отдельные классы конфигурации для каждого бизнес-объекта, т.е. PersonConfiguration, OrganizationConfiguration и т. Д.

Может кто-нибудь помочь мне с определением Fluent Configuration для этого сценария? Или укажите мне на пример?

Спасибо! (Код ниже)

PSEUDO CODE ............................................. ......................

// Business Obsject Base Class
// Should not be implemented as a database table!!!!
// No Primary Key Needed Here
public abstract class BusinessObject  
{  
   private List<BusinessRule> _businessRules = new List<BusinessRule>();  
   public List<BusinessRule> BusinessRules  
   {
     get { return _businessRules; }
   }

   private List<string> _validationErrors = new List<string>();
   public List<string> ValidationErrors
   {
     get { return _validationErrors; }
   }

   public DateTime CreatedDate { get; set; }
   public Person CreatedBy { get; set; }
   public ModifiedDate { get; set; }
   public Byte[] RowVersion { get; set; }
}

// Party Pattern Base Class inherits BusinessObject base class
// Shared Basis for People and Organizations
public abstract class Party : BusinessObject
{
   public virtual int PartyId { get; set; }
   public abstract string DisplayName { get; internal set; }
}

// Is a Party, Implements both BusinessObject base and Party base
public class Person : Party
{
   // Both a Primary and a Foreign Key
   // Should be a one-to-one relationship with Party
   //would like this to be "PersonId" not "PartyId" but it's OK if it is not
   public int PersonId { get; set; }  

   pubilc virtual string FirstName { get; set; }
   public virtual string LastName { get; set; }

   public override string DisplayName
   {
     get {  return LastName + ", " + FirstName;  }

     internal set { }
   }
}

// Is a Party, Implements both BusinessObject base and Party base
public class Organization : Party
{
  // Both a Primary and a Foreign Key
  // Should be a one-to-one relationship with Party
  //would like this to be "PersonId" not "PartyId" but it's OK if it is not
  public int OrganizationId { get; set; }

  pubilc virtual string Name { get; set; }

  public override string DisplayName
  {
    get {  return Name;  }

    internal set { }
  }
}

1 Ответ

1 голос
/ 15 декабря 2011

Довольно сложный вопрос.
Я думаю, что вам нужно реализовать наследование TPT (Table Per Type).Я подозреваю, что некоторые из ваших требований не будут удовлетворены EF.Для получения дополнительной информации посетите следующие ссылки:
Entity Framework + многоуровневое наследование + код EF сначала http://weblogs.asp.net/manavi/archive/2010/12/28/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt.aspx

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