在表表中引入FOREIGN KEY约束键可能会导致循环或多个级联路径.指定ON DELETE..错误

本文关键字:循环 级联 指定 错误 DELETE ON 路径 FOREIGN KEY 约束 | 更新日期: 2024-10-21 08:13:33

我试图在Nugget Package Manager控制台中运行更新数据库命令,但没有成功,因为我一直得到错误

Introducing FOREIGN KEY constraint 'FK_dbo.TeamToLeaders_dbo.Teams_TeamId' on table 'TeamToLeaders' 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. See previous errors..
I want to set up relationship in which there is a class called Team.cs that contains the below properties
public class Team
    {
        public int TeamId { get; set; }    
        public string TeamName { get; set; }    
        public Decimal MonthlyTarget { get; set; }    
        public ICollection<SalesAgent> Agents { get; set; }   
    }

这意味着一个团队有许多代理,还有另一个名为SalesAgent.cs的类,其中包含有关代理的信息

public class SalesAgent
    {
        [Key]
        public int AgentId { get; set; }    
        public string AgentFirstName { get; set; }    
        public string AgentLastName { get; set; }    
        public string HomeAddress { get; set; }    
        public bool IsActive { get; set; }    
        public string AgentPhone { get; set; }    
        public Decimal MonthlyTarget { get; set; }    
        public int TeamId { get; set; }
        public virtual Team Team { get; set; }        
    }

现在我想要一个类,我可以添加团队和代理之间的关系,即本质上我希望能够为每个团队分配一个团队领导者,所以我在下面设置了这个类

public class TeamToLeader
    {
        [Key]
        public int TeamToLeaderId { get; set; }
        [ForeignKey("Team")]
        public int TeamId { get; set; }              
        public int AgentId { get; set; }    
        public virtual Team Team { get; set; }    
        [ForeignKey("AgentId")]
        public virtual SalesAgent Agent { get; set; }
    }

在运行"更新数据库命令"时,我得到一个错误The ForeignKeyAttribute on property 'AgentId' on type 'SalesForce.Models.TeamToLeader' is not valid. The navigation property 'SalesAgent' was not found on the dependent type 'SalesForce.Models.TeamToLeader'. The Name value should be a valid navigation property name.

所以我把型号改成

public class TeamToLeader
{
    [Key]
    public int TeamToLeaderId { get; set; }
    [ForeignKey("Team")]
    public int TeamId { get; set; }
    [ForeignKey("SalesAgent")]
    public int AgentId { get; set; }
    public virtual Team Team { get; set; }       
    public virtual SalesAgent Agent { get; set; }
}

这导致了这个错误

Introducing FOREIGN KEY constraint 'FK_dbo.TeamToLeaders_dbo.Teams_TeamId' on table 'TeamToLeaders' 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. See previous errors.

请帮忙。

在表表中引入FOREIGN KEY约束键可能会导致循环或多个级联路径.指定ON DELETE..错误

您应该取消OneToManyCascadeDeleteConvention以强制EF不使用级联删除。在DbContext中添加:

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

或者您可以将外键设为null:

public class TeamToLeader
{
    [Key]
    public int? TeamToLeaderId { get; set; }
    [ForeignKey("Team")]
    public int? TeamId { get; set; }
    [ForeignKey("SalesAgent")]
    public int AgentId { get; set; }
    public virtual Team Team { get; set; }       
    public virtual SalesAgent Agent { get; set; }
}

取决于你喜欢哪种行为。

您也可以使用流利的API:

...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<TeamToLeader>().HasRequired(i => i.Agent).WithMany().WillCascadeOnDelete(false);
}
...

请注意,您的型号Team有许多SalesAgent和许多TeamToLeader。您的TeamSalesAgent型号中应该有TeamToLeaders集合:

...
public virtual ICollection<TeamToLeader> TeamToLeaders { get; set; }
...

我不确定你是否还需要Team到许多SalesAgent的关系。

作为这个链接,这个链接说。。。

这在理论上是正确的,但SQL server(而不是实体框架)不喜欢它,因为您的模型允许一名员工同时成为第一和第二团队的成员。如果团队被删除,这将导致同一Employee实体的多个删除路径。

SQL server不允许同一实体有多个删除路径。

该链接表示,可以通过禁用OneToManyCascadeDeleteConventionManyToManyCascadeDeleteConvention来解决,但那些删除操作应该由代码手动完成。