c# - 使用默认约定与可选依赖端的一对一关系

标签 c# entity-framework ef-code-first foreign-key-relationship one-to-one

我想使用 Entity Framework 代码优先模型中的默认约定映射一个主体实体 (Person) 和可选的依赖实体 (Car)。

this answer 中描述了一种解决方案,它使用 modelBuilder 上的 Fluent API 映射到 key 。

是否可以只使用默认的 EF 约定来做到这一点?以下代码将抛出 Unable to determine the principal end of an association between the types and Car. invalid operation 异常。

public DatabaseContext : DbContext
  public DbSet<Person> Persons { get; set; }
  public DbSet<Car> 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 无法确定 person 上的 CarIdCar 的外键,反之亦然?

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

Fluent API 缺点

当我尝试使用流畅的 API 定义关系时,它起作用了,但我无法将键映射到现有列,这就是我首先要使用约定的原因。我得到的异常(exception)是类型中的每个属性名称必须是唯一的。

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

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

最佳答案

Entity Framework 不支持一对一的外键关联。您必须删除外键属性并使用导航属性。以这种方式映射您的关系:

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

EF 将为您创建 FK:

enter image description here

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

关于c# - 使用默认约定与可选依赖端的一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27875390/

相关文章:

entity-framework - 使用模型构建器指定 HasForeignKey?

C#使用语句捕获错误

c# - 用于在新窗口/选项卡中打开其他网站链接的自动化系统

entity-framework - 您如何处理 Entity Framework 中的深层关系树?

c# - 无法在 .NET Core 中使用 EF 更新数据库

entity-framework-4.1 - EF 4.1 CodeFirst -- 一对多级联删除

c# - 将列表传递给构造函数然后存储它的约定是什么?

c# - 创建目录

entity-framework - 从现有数据库自动生成 JHipster 实体

c# - 如何将数据发布到数据库并将其绑定(bind)到同一 View 中的网络网格?