Из дочерних или родительских свойств навигации в Entity Framework Code First

Учитывая, что у меня есть две сущности: Deputy и DeputyProfile:

public class Deputy : IdableEntity
{
    [Required]
    public string FirstName { get; set; }

    public string Patronimic { get; set; }

    [Required]
    public string LastName { get; set; }
}

public class DeputyProfile : IdableEntity
{
    [Required]
    public string Dosieur { get; set; }
}

лучший способ установить между ними отношения «один-к-одному» - поместить свойство навигации из «Профиль-заместитель» в «заместитель» (от ребенка к родителю) или «виза-стих»?

Должно быть так ?:

public class DeputyProfile : IdableEntity
{
    [Required]
    public virtual Deputy Deputy{ get; set; }

    [Required]
    public string Dosieur { get; set; }
}

На каком логическом правиле лучше всего принять это решение?

P.S. Будучи дочерним элементом IdableEntity, класс получает собственное поле Guid Id.


person Maxim V. Pavlov    schedule 03.08.2012    source источник


Ответы (1)


Вы должны выбрать Основную (родительскую) сторону и Зависимую (дочернюю) сторону для любого отношения. Вы можете выбрать то, что вам больше нравится. Мне заместитель кажется очевидным Директором, поскольку у него, вероятно, будет намного больше связей по мере роста вашей модели.

Отношение «один к одному» реализуется с помощью общего первичного ключа; Профиль заместителя должен иметь в качестве первичного ключа идентификатор заместителя. Это сделает ваш код таким:

public class Deputy
{

   public int ID {get;set;}

   public int ProfileID {get;set;}
   public virtual DeputyProfile Profile {get;set;}

    [Required]
    public string FirstName { get; set; }

    public string Patronimic { get; set; }

    [Required]
    public string LastName { get; set; }
}

public class DeputyProfile
{
    public int DeputyID {get;set}
    public virtual Deputy Deputy {get;set}

    [Required]
    public string Dosieur { get; set; }
}

Примечание: как это реализовано сейчас, у каждого депутата должен быть профиль. Если профиль является необязательным, сделайте ProfileID значением «int?».

Я искренне рекомендую отличная серия блогов о реализации отношений в Entity Framework 4.1 и более поздних версиях.

person Dabblernl    schedule 03.08.2012
comment
Спасибо, я использую идентификаторы Guid, но, полагаю, это не имеет никакого значения. На всякий случай - в вашем ответе я вижу, что оба класса знают друг о друге и взаимно рекомендуются. Это единственный способ, которым это будет работать, или мой подход (который кажется гораздо более простым) также будет работать в DbContext, если у меня есть DbSets, определенные как для заместителя, так и для профиля-заместителя? Поскольку оба являются дочерними элементами IdableEntity, оба наследуют поле Guid Id. - person Maxim V. Pavlov; 04.08.2012
comment
@ MaximV.Pavlov 1. Использование GUID - это нормально. 2. Если зависимая сущность имеет свой собственный ключ, тогда связь становится «многие ко многим». Нет необходимости реализовывать свойство навигации с обеих сторон. 3. Не производите все свои классы из базового класса только для идентификатора. Он создаст одну большую таблицу для всех ваших классов: таблицу для построения иерархии. См. Серию блогов, о которой я упоминал выше. - person Dabblernl; 04.08.2012