我想创建一个级联删除自己的列表。为此,我创建了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约束。
无法创建约束。查看以前的错误。“
任何人都可以帮我解决这个问题吗?
答案 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);