实体框架代码优先一对一必需-必需关系

2024-03-12

使用 Entity Framework Code First 4.3.1 时,可以创建具有多重性的 1 对 1 关系。也就是说,关系的每一端都有一个实体。

可以将一对一关系配置为需要-需要 or 必需-可选^.然而,当我在两者之间切换时,我没有看到任何差异:

  • 生成的数据库架构。我的目标是 SQL Server 2008。
  • EF 的运行时行为。

因此,我能够创建一个必需的校长没有对应的记录必需的依赖者作为记录,尽管关系被配置为需要-需要。这似乎与文档相矛盾需要(...):

配置此实体类型所需的关系。除非指定此关系,否则实体类型的实例将无法保存到数据库中。数据库中的外键不可为空。

http://msdn.microsoft.com/en-us/library/gg671317 http://msdn.microsoft.com/en-us/library/gg671317

The 需要-需要关系实体:

public class RequiredPrincipalA
{
    public int Id { get; set; }
    public virtual RequiredDependentA DependentA { get; set; }
}

public class RequiredDependentA
{
    public int Id { get; set; }
    public virtual RequiredPrincipalA PrincipalA { get; set; }
}

The 必需-可选关系实体:

public class RequiredPrincipalB
{
    public int Id { get; set; }
    public virtual OptionalDependentB DependentB { get; set; }
}

public class OptionalDependentB
{
    public int Id { get; set; }
    public virtual RequiredPrincipalB PrincipalB { get; set; }
}

DbContext 和模型配置:

public class AppContext : DbContext
{
    public DbSet<RequiredPrincipalA> PrincipalAs { get; set; }
    public DbSet<RequiredDependentA> DependentAs { get; set; }

    public DbSet<RequiredPrincipalB> PrincipalBs { get; set; }
    public DbSet<OptionalDependentB> DependentBs { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<RequiredPrincipalA>()
            .HasRequired(o => o.DependentA)
            .WithRequiredPrincipal(o => o.PrincipalA);

        modelBuilder.Entity<RequiredPrincipalB>()
            .HasOptional(o => o.DependentB)
            .WithRequired(o => o.PrincipalB);
    }
}

测试代码:

Database.SetInitializer(new DropCreateDatabaseAlways<AppContext>());

using (var ctx = new AppContext())
{
    ctx.Database.Initialize(force: false);

    ctx.PrincipalAs.Add(new RequiredPrincipalA());
    ctx.PrincipalBs.Add(new RequiredPrincipalB());

    ctx.SaveChanges();
}

我知道我可以添加一个[必需的]data 属性到导航属性必需的主要A.依赖A and 必需的DependentA.PrincipalA。这将导致 EF 验证防止出现上述情况。但是,我不想这样做,因为它还会验证更新现有实体时填充的导航属性。这意味着应用程序必须为每次更新预取关系另一端的实体。

为什么我在更改之间的关系时看不到 EF 的行为有任何差异需要-需要 and 必需-可选?

^ 请注意,还支持可选-可选,但这不构成我的问题的一部分。配置可选-可选关系时,生成的数据库架构和运行时行为存在明显差异。


我不知道为什么在这种情况下允许required-required,但它不能存在于数据库中,因为关系是建立在主键上的。 required-required表示如果相关的B不存在则不能插入A,如果相关的A不存在则不能插入B => A或B都不能插入。

数据库关系始终具有主体和依赖实体 - 主体可以始终存在而无需依赖。

只有当A和B都映射到同一个表时,才能实现EF中真正的required-required(表分割 https://stackoverflow.com/questions/5390172/how-to-map-table-splitting-in-ef-code-first)因为在这种情况下它们都是用单个插入命令插入的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架代码优先一对一必需-必需关系 的相关文章

随机推荐