2013-12-15 2 views
1

У меня есть этот класс со следующими обратными свойствами:OneToOne Обратное свойство в том же классе возможно? Как?

public class Person 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public int FatherId { get; set; } 
    [ForeignKey("FatherId")] 
    public Person Father { get; set; } 

    public int MotherId { get; set; } 
    [ForeignKey("MotherId")] 
    public Person Mother { get; set; } 
} 

Извините, если это повторяющийся вопрос, но я не в состоянии решить и понять это.

При попытке создать базу данных, я получаю сообщение об ошибке:

Невозможно определить основной конец ассоциации между типами «TestEFInverseProperty.Person» и «TestEFInverseProperty.Person». Основной конец этой ассоциации должен быть явно сконфигурирован с использованием флагов API или> аннотаций данных.

Пожалуйста, как я могу это исправить?

Если это не лучший способ сделать такие отношения, как вы мне посоветуете?

ответ

1

Думаю, вам нужно будет сделать как FatherId, так и MotherId a System.Nullable<int>. То, как вы есть, Person не может существовать, если оно не имеет как Father и Mother, и оба Father и Mother должны каждый из них также имеют Father и Mother, и так далее. В какой-то момент вам нужно остановиться и позволить системе иметь Person без Father или Mother, что означает, что ваши внешние ключи должны быть нулевыми.

Кроме того, ваши навигационные свойства должны быть отмечены virtual.

Вот как вы могли бы сделать это с помощью текучего API:

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public int? FatherId { get; set; } 
    public virtual Person Father { get; set; } 

    public int? MotherId { get; set; } 
    public virtual Person Mother { get; set; } 
} 

public class PersonTypeConfiguration : EntityTypeConfiguration<Person> 
{ 
    public PersonTypeConfiguration() 
    { 
     HasOptional(x => x.Mother).WithMany().HasForeignKey(x => x.MotherId); 
     HasOptional(x => x.Father).WithMany().HasForeignKey(x => x.Father); 
    } 
} 

Приведенных выше говорят EF, что Mother и Father стороны отношений являются основными концами, с ребенком Person находясь на зависимом конец. Это связано с тем, что, учитывая любое отношение «один ко многим», многие стороны являются главными, а одна сторона является зависимой. Не имеет значения, является ли отношение рефлексивным (или, как вы говорите, обратным) для одного и того же объекта.

+0

Это сработало! Знать способ украсить атрибуты? Ну, что ж, спасибо! –

+0

Эта же модель может работать с атрибутами, пока ваши свойства 'MotherId' и' FatherId' являются 'int?' Вместо 'int'. – danludwig