使用默认约定与可选依赖端的一对一关系
One-to-one relationsip with optional dependent end using default conventions
我想要使用 Entity Framework 代码优先模型中的默认约定映射一个主体实体 (Person
) 和可选的从属实体 (Car
)。
this answer 中描述了一种解决方案,它使用 modelBuilder
上的流畅 API 映射到密钥。
是否可以只使用默认的 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; }
此示例假设一个人只能与 none 或一辆车相关联。我应该不能在没有关联的人的情况下插入汽车,但是我应该可以在没有关联的汽车的情况下插入人。为什么 EF 不会弄清楚 person 上的 CarId
是 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 ,这是 Person
行中的 PersonId
主键列。
One-to-one Entity Framework 不支持外键关联。您必须删除外键属性并使用导航属性。以这种方式映射您的关系:
modelBuilder.Entity<Person>().HasOptional(p => p.Car).WithRequired(c => c.Person);
EF 将为您创建 FK:
这是因为Entity Framework要求外键使用依赖(Person)的主键
我想要使用 Entity Framework 代码优先模型中的默认约定映射一个主体实体 (Person
) 和可选的从属实体 (Car
)。
this answer 中描述了一种解决方案,它使用 modelBuilder
上的流畅 API 映射到密钥。
是否可以只使用默认的 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; }
此示例假设一个人只能与 none 或一辆车相关联。我应该不能在没有关联的人的情况下插入汽车,但是我应该可以在没有关联的汽车的情况下插入人。为什么 EF 不会弄清楚 person 上的 CarId
是 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 ,这是 Person
行中的 PersonId
主键列。
One-to-one Entity Framework 不支持外键关联。您必须删除外键属性并使用导航属性。以这种方式映射您的关系:
modelBuilder.Entity<Person>().HasOptional(p => p.Car).WithRequired(c => c.Person);
EF 将为您创建 FK:
这是因为Entity Framework要求外键使用依赖(Person)的主键