使用默认约定的一对一关系和可选的依赖端

托马斯·赫伯鲍尔(TomášHübelbauer)

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

此答案中描述了一种解决方案,解决方案使用fluent APImodelBuilder映射到密钥。

是否可以仅使用默认的EF约定来执行此操作?下面的代码将引发无法确定类型Person和Car之间的关联的主要终点。无效的操作异常。

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不会弄清楚CarIdon person是外键,Car反之亦然?

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

流利的API缺点

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

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

如果我不进行任何MapKey调用,则SaveChanges成功,但是数据库检查显示该Car行的PersonId外键列包含0,而不是1,后者是行中的PersonId主键列Person

八叶球菌

实体框架不支持一对一的外键关联。您必须删除外键属性并使用导航属性。通过这种方式映射您的关系:

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

EF将为您创建FK:

在此处输入图片说明

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用默认约定的一对一关系和可选的依赖端

来自分类Dev

实体框架两端可选的一对一关系

来自分类Dev

代码优先的可选一对一关系

来自分类Dev

EF代码优先:使用数据注释设置可选的一对一关系

来自分类Dev

与共享主键和@OneToOne 在子端的单向一对一关系

来自分类Dev

接口和类的一对一关系

来自分类Dev

使用Python 2.76输出一对一关系

来自分类Dev

如何使用一对一关系关联模型

来自分类Dev

使用INTERLEAVE表进行一对一关系

来自分类Dev

在休眠中使用一对一关系删除

来自分类Dev

插入一对一关系

来自分类Dev

休眠一对一关系

来自分类Dev

休眠一对一关系

来自分类Dev

一对一关系插入

来自分类Dev

休眠一对一关系

来自分类Dev

建立一对一关系

来自分类Dev

GSON一对一关系

来自分类Dev

休眠一对一关系

来自分类Dev

一对一关系

来自分类Dev

MYSQL一对一关系

来自分类Dev

实现一对一关系

来自分类Dev

与查询的一对一关系

来自分类Dev

使用Entity Framework Code First和Fluent API配置许多一对一关系

来自分类Dev

如何创建一对一关系,双方关系都是可选的

来自分类Dev

如何在EntityFramework中映射可选的一对一关系

来自分类Dev

C#实体框架:可选的一对一关系

来自分类Dev

一对零或一对一关系中的重复键和表字段

来自分类Dev

sql 列之间的一对多和一对一关系

来自分类Dev

是否可以使用Entity Generator与用户默认实体创建单向一对一关系?