在实体框架 6 中'update-database'后出错



我正在使用实体框架 2 项目处理 WEB API 6,并且在更新数据库后遇到问题。

错误:

Introducing FOREIGN KEY constraint 'FK_dbo.Rates_dbo.Users_Id_User' on table 'Rates' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.

这是我的费率等级:

public class Rate
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id_Rate { get; set; }
public int Id_User { get; set; }
public int Id_Recipe { get; set; }
public int Value_Rate { get; set; } //1-5
public virtual User User { get; set; }
public virtual Recipe Recipe { get; set; }
}

和我的用户类:

public class User
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id_User { get; set; }
public int Id_List_Products { get; set; }
public int Id_List_Black_Products { get; set; }
public string Login { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public Boolean Social_Account { get; set; } // 1 - social account, 0 - normal account
public string URL_Avatar { get; set; } //URL of avatar thumbnail
public virtual List_Products List_Products { get; set; }
public virtual List_Black_Products List_Black_Products { get; set; }
}

我不知道问题出在哪里。 有什么提示吗?

出现此问题是由于关系的多种途径。如果您删除一条记录,它最终将从另一个表中删除其他记录,最终将从另一个表中删除更多记录,进而最终从您开始的表中删除记录,并且循环将重复。真正的灾难性,开发人员最糟糕的噩梦。要解决此问题,请添加自定义属性,例如,在迁移中:

CreateTable(
"dbo.SomeTable",
c => new
{
id = c.Int(nullable: false, identity: true),
createdon = c.DateTime(),
createdby = c.String(),
})
.PrimaryKey(t => t.id)
.ForeignKey("dbo.Customers", t => t.Customerid, cascadeDelete: true)
.ForeignKey("dbo.AnotherTable", t => t.Anotherid, cascadeDelete: false)
.Index(t => t.Customerid)
.Index(t => t.Scopeid);

cascadeDelete设置为falseAutoUpdate受影响的表/(模型类支持)false,并相应地更新数据库。

简单地说,你的关系是循环的,例如:客户 -> 工资 -> 工资单 -> 客户因此,当您删除客户时,其各自的工资记录将被删除,从而删除受人尊敬的工资单记录,这些记录循环回删除链接的客户,并且此循环不断重复,造成混乱。因此,实体框架和 SQL 非常了解这一点,并提示用户关闭受影响/导致错误的删除/更新连接。

Okey,我将 cascadeDelete 更改为 false:

CreateTable(
"dbo.Rates",
c => new
{
Id_Rate = c.Int(nullable: false, identity: true),
Id_User = c.Int(nullable: false),
Id_Recipe = c.Int(nullable: false),
Value_Rate = c.Int(nullable: false),
})
.PrimaryKey(t => t.Id_Rate)
.ForeignKey("dbo.Recipes", t => t.Id_Recipe, cascadeDelete: true)
.ForeignKey("dbo.Users", t => t.Id_User, cascadeDelete: false)
.Index(t => t.Id_User)
.Index(t => t.Id_Recipe);

它;)工作

最新更新