【问题标题】:Introducing multiple foreign keys Throws error Entity Framework 6引入多个外键引发错误实体框架 6
【发布时间】:2015-01-13 11:52:11
【问题描述】:

我的模型类是这样的

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 和实体框架的新手,所以不知道发生了什么。有人可以帮忙吗?

【问题讨论】:

  • ERF 是什么ERF..?
  • @spender 抱歉,实体关系框架
  • 除非我们谈论不同的东西,否则官方名称是实体框架,而不是实体关系框架。
  • @spender 啊啊,谢谢你纠正我,否则我很长时间都不会注意到它。

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


【解决方案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 时,这意味着当一个主体行被删除时,所有依赖行也应该被删除。有时,依赖行也可能是其他外键中的主体,这意味着当它们被删除时,它们的所有依赖行也会被删除。这就是错误消息“可能导致循环或多个级联路径”的意思。

上面会告诉 EF,当一个主体行被删除时,它的从属行不应该被删除。相反,如果主行有依赖项,则 DELETE 命令将被拒绝,您必须先删除依赖项。

【讨论】:

  • 我有点困惑,我需要在哪里添加这段代码?在控制器内部?
  • @Athul 上面的覆盖在您的派生DbContext 类中。它与控制器无关,这都是纯粹的EF。您的应用程序数据库优先还是模型优先?谁创建和升级数据库,你还是其他人?
  • 它的代码优先方法,我自己维护数据库。它是一个小应用程序
  • 如何设置 EF 模型配置属性?使用 Fluent API 或数据注释?
  • 我是 EF 新手,不确定您的问题。这是我正在关注的教程asp.net/mvc/overview/getting-started/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多