首先通过代码创建严格的1对1关系

时间:2012-06-05 07:47:03

标签: entity-framework ef-code-first one-to-one

我想先通过代码创建一对一的关系,下面是我的代码,

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的关系?

任何人都可以提供帮助吗?

1 个答案:

答案 0 :(得分:2)

只有当PersonPersonDetail都映射到同一个表时才有可能(映射技术称为Table Splitting),因为严格1:1表示你不能插入{{1}没有现有Person,但如果没有现有PersonDetail =&gt;您也无法插入PersonDetail你不能插入其中任何一个因为依赖将永远丢失(记住每个记录都有自己的插入命令,数据库检查每个命令之后的完整性,而不是事务之后)。

仅当您使用table splitting EF时,才会创建包含来自两个实体的数据的单个插入命令。在您的实体模型中,它看起来像两个具有1:1映射的实体,但在数据库中它将是单个表。