Asp.net mvc EF代码第一级级联空
我们有一个ASP MVC Entity Framework 6代码优先项目,在MS SQL数据库中有70多个表 对于每个表上的每条记录,我们将存储上次修改它的用户。几乎每个表的结构如下所示:Asp.net mvc EF代码第一级级联空,asp.net-mvc,entity-framework,ef-code-first,Asp.net Mvc,Entity Framework,Ef Code First,我们有一个ASP MVC Entity Framework 6代码优先项目,在MS SQL数据库中有70多个表 对于每个表上的每条记录,我们将存储上次修改它的用户。几乎每个表的结构如下所示: public class TableA { public int Id{ get; set; } ..... public DateTime? DateModified { get; set; } public int? UserModifiedId { get; set;
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中,则在删除用户时会出现错误
我们需要将UserModifiedId=UserId的所有表的UserModifiedId设置为NULL
在过去,我们在DELETE SET NULL上设置此添加到表,但EF不允许这样设置表
你知道我们怎样才能做到这一点吗
更新
我们已经知道EF管理这是因为子项被加载到上下文中,但是我们不能每次要删除用户时加载超过70个表。一种方法是添加一个迁移,该迁移可以修改所有表,这些表应该以这种方式在DELTE SET NULL上进行级联(仅适用于上面的示例代码):
另一个解决方法-不实际删除用户,而是将其标记为“软删除”,即通过设置
user.deleted=true
属性。我已经看到了此解决方案。这是一个很好的解决方案,但我一直在寻找“更干净”的东西哦,好的。据我所知,实体框架6是不可能开箱即用的。EntityFrameworkCore有可能以您想要的干净方式完成它。
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!
// ...
}
}