我想先通过代码创建一对一的关系,下面是我的代码,
class Person
{
public int id { get; set; }
public string Name { get; set; }
public virtual PersonDetail detail { get; set; }
}
class PersonDetail
{
public int id { get; set; }
public double Height { get; set; }
public double Weight { get; set; }
public virtual Person person { get; set; }
}
class EFTest : DbContext
{
public DbSet<Person> personSet { get; set; }
public DbSet<PersonDetail> detailSet { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>().HasRequired(x => x.detail).WithRequiredPrincipal(x => x.person);
}
}
但是我仍然可以插入一个没有人细节的人。我试图在模型中首先创建1对1的关系,它运行良好,如果我插入一端而没有另一端,则会抛出异常。为什么首先使用上面的代码创建一个1到0..1的关系?
任何人都可以提供帮助吗?
答案 0 :(得分:2)
只有当Person
和PersonDetail
都映射到同一个表时才有可能(映射技术称为Table Splitting),因为严格1:1表示你不能插入{{1}没有现有Person
,但如果没有现有PersonDetail
=&gt;您也无法插入PersonDetail
你不能插入其中任何一个因为依赖将永远丢失(记住每个记录都有自己的插入命令,数据库检查每个命令之后的完整性,而不是事务之后)。
仅当您使用table splitting EF时,才会创建包含来自两个实体的数据的单个插入命令。在您的实体模型中,它看起来像两个具有1:1映射的实体,但在数据库中它将是单个表。