2017-10-12 50 views
0

我用下面的代碼來配置級聯刪除兩個實體Entity1(原則)和Entity2(依賴)實體框架:將FK的原則表

modelBuilder.Entity<Entity1>() 
        .HasRequired(x => x.Entity2) 
        .WithRequiredPrincipal() 
        .Map(x => x.MapKey("Entity1_Id")) 
        .WillCascadeOnDelete(true); 

這將導致FK表示兩者之間的關係實體是否在Entity2表中,是否可以在Entity1表中將此更改爲FK,同時將Entity1保留爲原則,將Entity2保留爲從屬?

+0

你試圖讓一對一的關係? –

+0

是的,當然,否則它將是無意義的。 – Sisyphus

+1

在EF一對一關係中,總是依賴實體將具有原理表的FK。另一種方式是不可能的。 –

回答

0

對於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。

+0

對不起,我沒有得到如何解決我的問題,請你解釋一下。 – Sisyphus

+0

如果您希望Entity2擁有自己的ID並在父實體中引用該ID,那麼這是一種多對一的關係,而不是1對1關係。對於1對1,在兩個表中都使用相同的PK。我只是在多對一的場景中嘗試了cascadeDelete,但這種方式並不奏效,它會讓孩子成爲孤兒。在這種情況下,級聯從小孩到父母。 (刪除Entity1不會刪除Entity2,但刪除Entity2會級聯刪除Entity1)我會更新我的答案以澄清這一點。 –