1

EF 4.1數據庫第一種方法。EF 4.1多對多刪除家長應刪除相關子女

說我有這個表模式

Users 1---M UserRoles M---1 Roles

級聯刪除是外鍵

該表的UserRole像有額外CreatedDate列設置,所​​以我創建一個的UserRole模型和相應的映射。

我結束了以下型號:

User 
---- 
int Id 
string Name 
List<UserRoles> UserRoles 

UserRoles 
--------- 
int UserId 
int RoleId 
DateTime CreatedDate 
User User 
Role Role 

Role 
---- 
int Id 
string Name 
List<UserRoles> UserRoles 

如果我有我的配置是正確的,我應該能夠刪除用戶,並將用戶角色行,而不必手動清除的UserRole集合中刪除?

所以我能不能做到這一點:

DbContext.Entry(user).State = EntityState.Deleted; 
DbContext.SaveChanges(); 

還是我必須這樣做:

user.UserRoles.Clear(); 
DbContext.Entry(user).State = EntityState.Deleted; 
DbContext.SaveChanges(); 

我的測試表明我要明確孩子集合,但我發現相互矛盾的信息如果我正確級聯刪除安裝程序,它應該只能刪除用戶。

時候,不清楚,我收到此錯誤的UserRole:您在澄清這一幫助

The relationship could not be changed because one or more of the foreign-key properties is non-nullable

謝謝!

回答

3

您必須使用

DbContext.Users.Remove(user); 

這是不一樣的東西的狀態設置爲Deleted。設置狀態不會將帶有級聯刪除設置的任何子對象標記爲Deleted,但Remove將執行此操作。

狀態設置爲Deleted應該工作IF沒有孩子被加載到上下文,因爲EF將父到數據庫,該數據庫將刪除的孩子只有一個DELETE語句,以及由於級聯刪除數據庫。

IF但是,您已經將子項加載到上下文中,將父項的狀態設置爲Deleted將不會設置子項的狀態。 EF會拋出異常,這不是抱怨的數據庫。

+2

謝謝!我以爲我瘋了...是的,孩子們被裝載,這解釋了爲什麼這不按預期工作。他們(英孚團隊)應該改變這種行爲...似乎不是很直觀 – 2012-02-09 16:41:58

1

您應該能夠指定刪除角色或用戶將刪除子級授予。您可以在流暢DbModelBuilder API使用WillCascadeOnDelete()方法:

modelBuilder.Entity<UserRoles> 
    .HasRequired(d => d.User) 
    .WithMany(p => p.UserRoles) 
    .HasForeignKey(d => d.UserId) 
    .WillCascadeOnDelete(); 

modelBuilder.Entity<Role> 
    .HasMany(p => p.UserRoles) 
    .WithRequired(d => d.Role) 
    .HasForeignKey(d => d.RoleId) 
    .WillCascadeOnDelete(); 

採用這種設置,刪除用戶或角色也應該刪除所有的的UserRole。

+0

當你說「應該」你的意思是你有工作代碼這樣做? – 2012-02-09 15:15:24

+0

是的,我們的模型與您的模型非常相似,除了我們將UserRole稱爲「Grant」實體,並且我們不公開外鍵屬性。此外,您必須確保所有導航和收藏屬性都在POCO中標記爲虛擬。雖然我們沒有任何刪除角色的代碼,但我們確實有刪除用戶的代碼,並且由於'WillCascadeOnDelete',它會級聯到授予。 – danludwig 2012-02-09 16:06:31