使用 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 必需-可选?
^ 请注意,还支持可选-可选,但这不构成我的问题的一部分。配置可选-可选关系时,生成的数据库架构和运行时行为存在明显差异。