0

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

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

任何人都可以帮忙吗?

4

1 回答 1

2

只有当两者都映射到同一个表时才有可能PersonPersonDetail映射技术称为表拆分),因为严格的 1:1 意味着您不能在Person不存在的情况下插入,PersonDetail但您也不能在PersonDetail不存在的情况下插入Person=> 您不能插入其中任何一个因为依赖关系总是会丢失(记住每条记录都有自己的插入命令,数据库在每个命令之后而不是在事务之后检查完整性)。

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

于 2012-06-05T08:35:11.290 回答