2017-10-18 117 views
1

我們在MS SQL數據庫中擁有70多個表的ASP MVC實體框架6代碼優先項目。EF代碼第一級聯NULL

對於每個表上的每條記錄,我們都存儲修改過的用戶最後一條記錄。幾乎每個表的結構是這樣的:

public class TableA 
{ 
    public int Id{ get; set; } 
    ..... 
    public DateTime? DateModified { get; set; } 
    public int? UserModifiedId { get; set; } 
    public virtual ApplicationUser UserModified { get; set; } 
} 

我們的問題是刪除用戶時,如果用戶ID是在任何表格的財產UserModifiedId的,我們正在一個錯誤。

我們需要將EF設置爲NULL UserModifiedId = UserId所有表的UserModifiedId。

在過去,我們將此添加到表ON DELETE SET NULL,但EF不允許設置這樣的表。

任何想法我們該怎麼做到這一點?

修訂

我們已經知道EF管理,這是孩子們被加載到上下文,但我們不能加載我們要刪除用戶每次超過70+表。

+0

另一個解決辦法 - 不真正刪除用戶,但標誌他們作爲「軟刪除」,即通過設置「user.Deleted = true」屬性。 –

回答

1

一種方法可能是添加的修改時應該有CASCADE ON DELTE SET NULL像這樣所有的表遷移(僅適用於您的示例代碼段):

public partial class AddOnDeleteSetNull : DbMigration 
{ 
    public override void Up() 
    { 
     Sql("ALTER TABLE dbo.TableA DROP CONSTRAINT [FK_dbo.TableA_dbo.Users_UserModifiedId]"); 
     Sql("ALTER TABLE dbo.TableA ADD CONSTRAINT [FK_dbo.TableA_dbo.Users_UserModifiedId_SetNullOnDelete] FOREIGN KEY (UserModifiedId) REFERENCES dbo.Users(UserId) ON UPDATE NO ACTION ON DELETE SET NULL"); 
    } 

    public override void Down() 
    { 
     // Here you have to undo the changes! 
     // ... 
    } 
} 
+0

我見過這個解決方案。這是一個很好的解決方案,但我正在尋找「更清潔」的東西 –

+0

哦,好吧。據我所知,開箱即用的Entity Framework 6是不可能的。實體框架核心有可能以你想要的乾淨方式進行。 – ChW