我的这个类有以下反向属性:
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或>数据注释显式配置>此关联的主要结尾。
请问,我该如何解决?
如果这不是建立这种关系的最佳方式,你如何建议我?
答案 0 :(得分:1)
我认为您必须同时将FatherId
和MotherId
设为System.Nullable<int>
。您拥有它的方式,Person
除非同时包含Father
和Mother
,否则Father
和Mother
都必须{ {1}}和Father
,依此类推。在某些时候,您必须停止并允许系统拥有Mother
而没有Person
或Father
,这意味着您的外键需要可以为空。
此外,您的导航属性应标记为Mother
。
以下是使用流畅API进行操作的方法:
virtual
以上是告诉EF,关系的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);
}
}
和Mother
方是主要目标,而子Father
位于依赖端。这是因为给定任何一对多关系,许多方面是主体,而一方是依赖方。如果这种关系对同一实体具有反身性(或者说是反向性),则无关紧要。