對於1對1關係,PK通常在兩個表中都是相同的名稱。在主表中具有輔助ID會形成多對一的關係。對於1比0/1,你會看到: 即。
public class MyEntity
{
public Guid EntityId { get; set; }
// ...
}
public class RelatedEntity
{
public Guid EntityId { get; set; }
// ...
}
和
modelBuilder.Entity<MyEntity>()
.HasRequired(x => x.RelatedEntity)
.WithRequiredPrincipal() // 1-1 in EF, 1-0/1 in SQL Server
.Map(x => x.MapKey("EntityId"))
.WillCascadeOnDelete(true);
如果RelatedEntity具有參考回到myEntity所那麼你不應該需要使用映射鍵:
modelBuilder.Entity<MyEntity>()
.HasRequired(x => x.RelatedEntity)
.WithRequiredPrincipal(x => x.MyEntity)
.WillCascadeOnDelete(true);
否則,你正在尋找一個多對一的關係(如選擇一個查找),它將在主表中具有相關的ID,但與父代無關:
public class MyEntity
{
public Guid EntityId { get; set; }
public virtual RelatedEntity RelatedEntity { get; set; }
}
和
modelBuilder.Entity<MyEntity>()
.HasRequired(x => x.RelatedEntity)
.WithMany()
.WillCascadeOnDelete(true);
通過啓用級聯刪除,這將允許它模仿一個1-1的關係,但在結構上它是許多爲1,意味着沒有什麼架構,側面或EF阻止你分配相同的相關實體到2個不同的主要記錄。如果這樣做,當您嘗試刪除其中一個初選時,如果級聯刪除爲True,則會出現錯誤。
編輯以上多對1方案中的級聯選項不會從父級級聯到子級級聯,但在此情況下級聯選項會從子級級聯到父級級聯。如果你有ENTITY1的DbSet,但沒有可用的ENTITY2的DbSet那麼你可以臨時添加ENTITY2的DbSet除去兒童和關聯的家長:
其中「背景」是你的的DbContext
var entity2Set = context.Set<Entity2>();
entity2Set.Remove(entity1.Entity2);
context.SaveChanges();
實例
當CascadeDelete爲True時,將刪除Entity1和Entity2。
如上所述,它模仿1對1的方式允許Entity1擁有Entity2Id,但不推薦,因爲在EF或SQL中沒有任何東西阻止您將同一個Entity2Id分配給多個Entity1記錄。 (在這種情況下級聯會刪除多個實體1記錄)對於正確的1對1,在父實體和子實體上都使用相同的ID。
你試圖讓一對一的關係? –
是的,當然,否則它將是無意義的。 – Sisyphus
在EF一對一關係中,總是依賴實體將具有原理表的FK。另一種方式是不可能的。 –