引入多个外键引发错误实体框架6

时间:2015-01-13 11:52:12

标签: c# entity-framework asp.net-mvc-5

我的模型类就像这样

public class ProcedurePrice
{
    public int ProcedurePriceID { get; set; }

    public int DepartmentID { get; set; }
    public int ProcedureID { get; set; }
    public int InsuranceProviderID { get; set; }
    public int ProcedureCategoryID { get; set; }
    public int ProcedureSubCategoryID { get; set; }
    public virtual Department Department { get; set; }
    public virtual InsuranceProvider InsuranceProvider { get; set; }
    public virtual ProcedureCategory ProcedureCategory { get; set; }
    public virtual ProcedureSubCategory ProcedureSubCategory { get; set; }
    public virtual Procedure Procedure { get; set; }
}

参考模型,

public class Department
{
    public int DepartmentID { get; set; }
    public string Name { get; set; }
}

依旧...... 控制器

public class ProcedurePriceController : Controller
{
    private readonly DiagnosisContext db = new DiagnosisContext();

    // GET: /ProcedurePrice/
    public ActionResult Index()
    {
        IQueryable<ProcedurePrice> procedureprices =
        db.ProcedurePrices.Include(p => p.Department)
            .Include(p => p.InsuranceProvider)
            .Include(p => p.Procedure)
            .Include(p => p.ProcedureCategory)
            .Include(p => p.ProcedureSubCategory);
        return View(procedureprices.ToList());
    }  
}

这会抛出这样的错误

  

介绍FOREIGN KEY约束'FK_dbo.ProcedurePrice_dbo.InsuranceProvider_InsuranceProviderID'   表'ProcedurePrice'可能会导致循环或多个级联路径。   指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他   FOREIGN KEY约束。

我是MVC和实体框架的新手,所以不知道发生了什么。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

您应该指定在删除实体时,不应该级联删除。也许是这样的:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<ProcedurePrice>()
        .HasRequired(x => x.InsuranceProvider).WithMany()
        .WillCascadeOnDelete(false); // this is what you need
}

在SQL中为外键指定ON DELETE CASCADE时,表示删除主体行时,也应删除所有相关行。有时,依赖行也可能是其他外键中的主体,这意味着当它们被删除时,它们的所有依赖项也会被删除。这就是错误消息的含义&#34;可能导致循环或多个级联路径&#34;。

以上将告诉EF,当删除主要行时,不应删除其依赖项。相反,如果主要行具有依赖项,则DELETE命令将被拒绝,您必须首先删除依赖项。