當使用實體框架代碼第一個4.3.1時,可以創建多重1對1的關係。也就是說,關係的每一端都有一個實體。實體框架代碼首先一對一所需的關係
它可以配置1對1的關係爲所需要求的或需要-可選 ^。但是,當我在兩者之間切換時,我看不到任何區別:
- 生成的數據庫架構。我的目標是SQL Server 2008.
- EF的運行時行爲。
因此,我可以沒有相應的RequiredDependentAs紀錄創造RequiredPrincipalAs記錄,儘管關係被配置爲要求,需要。這似乎矛盾的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和模型的conf iguration:
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();
}
我知道我可以一個[必需]數據屬性添加到導航性能RequiredPrincipalA.DependentA和RequiredDependentA.PrincipalA 。這會導致EF驗證以防止上述情況。但是,我不想這樣做,因爲它還驗證更新現有實體時是否填充了導航屬性。這意味着應用程序必須預先獲取關係另一端的實體以進行每次更新。
爲什麼改變之間的關係所需要求的和必需的可選就當沒看到在EF的行爲有什麼區別?
^請注意,可選的選項也支持,但這不構成我的問題的一部分。在配置可選 - 可選關係時,生成的數據庫模式和運行時行爲有明顯區別。
謝謝你的回答。這當然可以闡明我的問題的數據庫模式方面。但是,我非常想知道爲什麼EF中沒有任何明顯的行爲改變。 –
是否允許需要 - 因爲它可以由EF強制運行,即使它實際上不可能在SQL中強制執行此約束? –
Luke,在配置r/r和r/o時,模式沒有差別,現在可以理解,這要歸功於Ladislav的回答。現在的要點是,儘管文檔說明了什麼,但r/r似乎並沒有在運行時被EF強制執行。 –