2017-10-18 141 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