外键导致循环或多个级联路径

时间:2015-06-23 06:57:35

标签: asp.net-mvc entity-framework

我想创建一个级联删除自己的列表。为此,我创建了3个模型类State,District和User。但是在发生异常时发生了。

public class State
    {
        public int StateID { get; set; }
        public string StateName { get; set; }
    }

 public class District
    {
        public int DistrictID { get; set; }
        public string DistrictName { get; set; }

        public int StateID { get; set; }

        public virtual State state { get; set; }
        }
 public class User
    {
        public int UserID { get; set; }
        public string UserName { get; set; }

        public int StateID { get; set; }
        public int DistrictID { get; set; }

        public virtual State state { get; set; }
        public virtual District district { get; set; }

    } 

例外是,

  

“发生了'System.Data.SqlClient.SqlException'类型的异常   EntityFramework.dll但未在用户代码中处理

其他信息:在表'用户'上引入FOREIGN KEY约束' FK_dbo.Users_dbo.States_StateID '可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

无法创建约束。查看以前的错误。“

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

当您的外键关系定义为ON DELETE CASCADE时会发生这种情况。要在流畅的api关系定义中覆盖它,请添加.WillCascadeOnDelete(false):

HasRequired(e => e.State )
   .WithMany()
   .HasForeignKey(e => e.StateID)
   .WillCascadeOnDelete(false);

您必须找出改变此删除行为所需的关系。根据我的经验,几乎在所有情况下将CascadeOnDelete设置为false通常会更好,因为它会导致更可预测的db行为。 ON DELETE CASCADE可能会导致一些意外删除。它仅对作为多对多关系的连接表的表有用。

答案 1 :(得分:0)

我的朋友Subin Jacob(用户:1923685)帮我解决了这个问题。

在UserModel类中编写以下代码

public class ProjectContext : DbContext
    {
        public DbSet<State> state { get; set; }
        public DbSet<District> district { get; set; }
        public DbSet<User> user { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention();
        }
    }

和Global.asax.cs

    Database.SetInitializer<ProjectContext>(null);