使用默认约定的可选从属端的一对一关系

我希望使用Entity Framework代码优先模型中的默认约定来映射具有可选依赖实体( Car )的主体实体( Person )。

此答案中描述了一种解决方案,它使用modelBuilder上的流畅API映射到密钥。

是否可以仅使用默认的EF约定来执行此操作? 以下代码将抛出一个Unable来确定Person和Car类型之间关联的主要结尾。 无效的操作exception。

 public DatabaseContext : DbContext public DbSet Persons { get; set; } public DbSet Cars { get; set; } // No OnModelCreating - possible? public class Person public Int32 PersonId { get; set; } public Int32? CarId { get; set; } // Optional. public virtual Car Car { get; set; } public class Car public Int32 CarId { get; set; } public Int32 PersonId { get; set; } public virtual Person Person { get; set; } 

此示例假定一个人只能与无车辆或一辆车相关联。 我不应该在没有相关人员的情况下插入汽车,但我应该能够插入没有相关汽车的人。 为什么EF不会发现CarId on person是Car的外键,反之亦然?

我在.NET Framework 4.5上使用Entity Framework 6.1.2。

流畅的API缺点

当我尝试使用流畅的API定义关系时,它可以工作,但我无法将键映射到现有列,这就是我想首先使用约定的原因。 我得到的例外是一个类型中的每个属性名称必须是唯一的。

 modelBuilder.Entity().HasOptional(p => p.Car).WithRequired(c => c.Person).Map(a => a.MapKey("PersonId")); 

如果我省略了MapKey调用,则SaveChanges成功,但数据库检查显示Car行的PersonId外键列包含0而不是1,这是Person行中的PersonId主键列。

entity framework不支持一对一外键关联。 您必须删除外键属性并使用navegation属性。 以这种方式映射你的关系:

 modelBuilder.Entity().HasOptional(p => p.Car).WithRequired(c => c.Person); 

EF将为您创建FK:

在此处输入图像描述

这是因为Entity Framework要求将依赖项(Person)的主键用作外键。