2013-03-06 52 views
9

我使用代碼優先的EF和TPT(Table per Type)繼承。我有以下型號:如何在代碼中啓用TPT(table per type)繼承中的級聯刪除?

public partial class AccountHolder 
{ 
    public int AccountHolderId { get; set; } 

    public virtual Address Detail { get; set; } 
    public virtual Nominee Nominee { get; set; } 
} 

public partial class Nominee 
{ 
    public int NomineeId { get; set; }    
} 

public abstract class Address 
{ 
    public int AddressId { get; set; } 
    ... 
} 

public class PersonalDetail : Address 
{ 
    public int PersonalDetailId { get; set; } 
    ... 
} 

流利的API:

 modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Nominee) 
              .WithRequired() 
              .WillCascadeOnDelete(); 

根據this tutorial這裏是賬戶持有和地址之間的關係多態性。 PersonalDetail繼承地址。我的問題是,每當我刪除任何AccountHolder我想EF會照顧從地址和PersonalDetail表中刪除其相關的PersonalDetail信息,但目前這不是happing,任何人都可以指導我如何通過流利的API或其他一些實現此行爲方法?

編輯:

根據當我使用這個配置的發佈回答:

 modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Detail) 
              .WithRequired() 
              .WillCascadeOnDelete(); 

用於啓用級聯刪除,這是與現有賬戶持有人及代理人之間的1對1的關聯衝突。例外是:

檢測到衝突的變化。嘗試插入具有相同密鑰的多個實體時可能會發生這種情況。

回答

1
指定EntityTypeConfiguration

http://msdn.microsoft.com/en-us/library/gg679348(v=vs.103).aspx

當你在問題中張貼例如

退房的WillCascadeOnDelete功能,它們有:

modelBuilder.Entity<Customer>() 
       .HasOptional(c => c.BillingAddress) 
       .WithRequired(); 

巴掌WillCascadeOnDelete(真)在(或者你想要級聯的任何實體)的結尾,並且應該這樣做。喜歡的東西:

modelBuilder.Entity<AccountHolder>().HasOptional(a => a.Address).WithRequired().WillCascadeOnDelete(true); 
+0

我已經1比1和賬戶持有與OtherTable'您提出這樣這就是爲什麼當我加入你比它建議配置相同的配置之間的關係'我顯示了一個例外'衝突檢測到更改。嘗試插入多個實體時使用相同的密鑰可能會發生這種情況。「對不起,在我的問題中沒有提及這一點,我更新了我的問題。 – gaurav 2013-03-06 18:25:26

+0

其他人也遇到了TPT繼承。看看http://stackoverflow.com/questions/9064273/cascade-delete-in-entity-framework-table-per-type-in​​heritance,聽起來像有一個bug /功能,使刪除有點毛茸茸的,但它是可能的。 此外,應該像上面發佈的示例一樣配置每個級聯關係,只是爲了確保它們級聯(儘可能多地使用該鏈接中說明的錯誤/功能) – 2013-03-06 18:33:14

+0

yaa我已經檢查過這篇文章,但在我的情況不知何故記錄是不是從PersonalDetail表中刪除(派生表) – gaurav 2013-03-06 18:35:51

相關問題