首页 文章

“循环或多个级联路径”与“ApplicationUser”模型的关系

提问于
浏览
2

我在我的项目中定义了很多类,并且作为审计要求,我项目中的每个实体都必须使用“AspNetUser”表的外键,一个指定创建记录的用户,另一个指定用户 . 更新了它 . 以下是“客户”实体的示例,但正如我所说,有大量实体都具有相同的要求:

public class Customer {

    public int Id {get; set;}

    // bunch of properties

    [Required]
    public string CreateUserId {get; set;} 
    [Required]
    public string UpdateUserId {get; set;}

    [ForeignKey("CreateUserId")]
    public virtual ApplicationUser CreateUser {get; set;}
    [ForeignKey("UpdateUserId")]
    public virtual ApplicationUser UpdateUser {get; set;}
}

现在因为AspNetUser表有两个外键,当我想创建迁移并更新数据库时,我得到了一个很好的旧错误:

在表'Customers'上引入FOREIGN KEY约束'FK_dbo.Customers_dbo.AspNetUsers_UpdateUserId'可能会导致循环或多个级联路径 . 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束 . 无法创建约束 . 查看以前的错误 .

我也明白,通过向“OnModelCreate”添加一些代码并删除“Customer”实体的级联效果,我将能够解决这个问题,但是,正如我所说,我的应用程序中的每个实体都会有这个两个指向AspNetUser表的链接,这意味着我每次都要使用我正在讨论的特定实体将这段代码添加到OnModelCreate中 .

另外,我不想取消CASCADE DELETE效果作为一个整体,因为它会影响所有部分中应用程序的功能 . 知道如何才能有效地解决这个问题?

我记得在我进行数据库编程的那些日子里,一个实体有两个外键到另一个实体的问题从未出现过任何问题 .

1 回答

  • 1

    你应该通过fluentApi设置WillCascadeOnDelete = False,像这样:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
                 modelBuilder.Entity<Customer >()
                    .HasRequired(c => c.CreateUser)
                    //.WithMany()
                    .HasForeignKey(c => c.CreateUserId)
                    .WillCascadeOnDelete(false);
    
                 modelBuilder.Entity<Customer>()
                    .HasRequired(c => c.UpdateUser )
                    //.WithMany()
                    .HasForeignKey(c => c.UpdateUserId )
                    .WillCascadeOnDelete(false);
    }
    

相关问题