【发布时间】:2021-01-16 06:15:45
【问题描述】:
使用 Entity Framework Code First 4.3.1 时,可以创建具有 1 对 1 多重性的关系。也就是说,关系的每一端都有一个实体。
可以将 1 对 1 关系配置为 required-required 或 required-optional ^。但是,当我在两者之间切换时,我看不出有任何区别:
- 生成的数据库架构。我的目标是 SQL Server 2008。
- EF 的运行时行为。
因此,尽管关系被配置为 required-required .这似乎与 HasRequired(...) 的文档相矛盾:
从该实体类型配置所需的关系。除非指定此关系,否则实体类型的实例将无法保存到数据库中。数据库中的外键不可为空。
必需-必需关系实体:
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; }
}
必选关系实体:
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();
}
我知道我可以将 [Required] 数据属性添加到 RequiredPrincipalA.DependentA 和 RequiredDependentA.PrincipalA 的导航属性中。这将导致 EF 验证阻止上述情况。但是,我不想这样做,因为它还会在更新现有实体时验证导航属性是否已填充。这意味着应用程序必须为每次更新预取关系另一端的实体。
为什么仅在更改 required-required 和 required-optional 之间的关系时,我看不到 EF 的行为有任何差异?
^ 请注意,也支持可选可选,但这不构成我的问题的一部分。配置可选-可选关系时,生成的数据库架构和运行时行为存在明显差异。
【问题讨论】:
标签: entity-framework