在table上引入外键约束可能会造成循环或多级联路径
Introducing Foreign key Constraint on table may cause cycles or multiple cascade paths
我已经发现了许多其他类似的问题,但我不确定为什么它会出现在我的实体上。用简单的英语表示以下内容。三个实体,帐户、站点和合同。一个帐户可以有多个站点。一个账户可以有多个合约。一个站点可以有多个合同。因此,在某些情况下,您可以将合同附加到网站,然后将合同附加到帐户或合同直接附加到帐户。
我假设我得到这个是因为删除合同有两种可能的级联,它要么在删除帐户时级联并且直接附加到帐户,要么在删除时级联网站被删除。
我认为因为合同中不需要 AccountId 或 SiteId,所以这不应触发错误。我想要做的是将合同附加到站点(随后是帐户)或将合同直接附加到帐户 - 但我仍然想保持数据库参照完整性。
Introducing FOREIGN KEY constraint 'FK_dbo.Contract_dbo.Site_SiteId' on table 'Contract' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
我的classes/entities:
账户
public partial class Account
{
public int Id { get; set; }
[Display(Name = "Account Name")]
[Required]
[MinLength(3, ErrorMessage = "The Account Name should be at least 3 characters")]
[MaxLength(40, ErrorMessage = "The Account Name should be no more than 40 characters")]
[Remote("IsAccountNameAvailable", "Helper", ErrorMessage = "This Account name already exists, please try another name")]
public string AccountName { get; set; }
[ScaffoldColumn(false)]
[Display(Name = "Date Account Added")]
public DateTime DateAdded { get; set; }
public virtual ICollection<Site> Sites { get; set; }
public virtual ICollection<Contract> Contracts { get; set; }
}
网站
public partial class Site
{
public int Id { get; set; }
[Required(ErrorMessage = "A site must be attached to an account - please specify an account")]
[Display(Name = "Parent Account")]
public int AccountId { get; set; }
[Display(Name = "Site Name")]
[Required]
[MinLength(3, ErrorMessage = "The Site Name should be at least 3 characters")]
[MaxLength(40, ErrorMessage = "The Site Name should be no more than 40 characters")]
public string SiteName { get; set; }
[ScaffoldColumn(false)]
public DateTime DateAdded { get; set; }
[Required]
[Display(Name = "Primary Site")]
//[Remote("IsThereAlreadyAPrimarySite", "Helper", AdditionalFields = "AccountId", ErrorMessage = "There is already a primary site set for this account", HttpMethod = "POST")]
public bool PrimarySite { get; set; }
[Display(Name = "Site Notes")]
[Column(TypeName = "text")]
public string SiteNotes { get; set; }
public virtual Account Account { get; set; }
public virtual ICollection<Contract> Contracts { get; set; }
}
合同
public partial class Contract
{
public int Id { get; set; }
public int AccountId { get; set; }
public int SiteId { get; set; }
[Display(Name = "Contract Type")]
[Required]
public int ContractTypeId { get; set; }
public virtual Account Account { get; set; }
public virtual Site Site { get; set; }
public virtual ContractType ContractType { get; set; }
}
在您的 DbContext
文件覆盖方法 OnModelCreating
中,至少有一个关系必须配置为在删除时不级联。该关系必须在删除时明确处理
protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
base.OnModelCreating( modelBuilder );
modelBuilder.Entity<Contract>()
.HasRequired( c => c.Site)
.WithMany( s => s.Contracts )
.WillCascadeOnDelete( false );
}
我已经发现了许多其他类似的问题,但我不确定为什么它会出现在我的实体上。用简单的英语表示以下内容。三个实体,帐户、站点和合同。一个帐户可以有多个站点。一个账户可以有多个合约。一个站点可以有多个合同。因此,在某些情况下,您可以将合同附加到网站,然后将合同附加到帐户或合同直接附加到帐户。
我假设我得到这个是因为删除合同有两种可能的级联,它要么在删除帐户时级联并且直接附加到帐户,要么在删除时级联网站被删除。
我认为因为合同中不需要 AccountId 或 SiteId,所以这不应触发错误。我想要做的是将合同附加到站点(随后是帐户)或将合同直接附加到帐户 - 但我仍然想保持数据库参照完整性。
Introducing FOREIGN KEY constraint 'FK_dbo.Contract_dbo.Site_SiteId' on table 'Contract' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
我的classes/entities:
账户
public partial class Account
{
public int Id { get; set; }
[Display(Name = "Account Name")]
[Required]
[MinLength(3, ErrorMessage = "The Account Name should be at least 3 characters")]
[MaxLength(40, ErrorMessage = "The Account Name should be no more than 40 characters")]
[Remote("IsAccountNameAvailable", "Helper", ErrorMessage = "This Account name already exists, please try another name")]
public string AccountName { get; set; }
[ScaffoldColumn(false)]
[Display(Name = "Date Account Added")]
public DateTime DateAdded { get; set; }
public virtual ICollection<Site> Sites { get; set; }
public virtual ICollection<Contract> Contracts { get; set; }
}
网站
public partial class Site
{
public int Id { get; set; }
[Required(ErrorMessage = "A site must be attached to an account - please specify an account")]
[Display(Name = "Parent Account")]
public int AccountId { get; set; }
[Display(Name = "Site Name")]
[Required]
[MinLength(3, ErrorMessage = "The Site Name should be at least 3 characters")]
[MaxLength(40, ErrorMessage = "The Site Name should be no more than 40 characters")]
public string SiteName { get; set; }
[ScaffoldColumn(false)]
public DateTime DateAdded { get; set; }
[Required]
[Display(Name = "Primary Site")]
//[Remote("IsThereAlreadyAPrimarySite", "Helper", AdditionalFields = "AccountId", ErrorMessage = "There is already a primary site set for this account", HttpMethod = "POST")]
public bool PrimarySite { get; set; }
[Display(Name = "Site Notes")]
[Column(TypeName = "text")]
public string SiteNotes { get; set; }
public virtual Account Account { get; set; }
public virtual ICollection<Contract> Contracts { get; set; }
}
合同
public partial class Contract
{
public int Id { get; set; }
public int AccountId { get; set; }
public int SiteId { get; set; }
[Display(Name = "Contract Type")]
[Required]
public int ContractTypeId { get; set; }
public virtual Account Account { get; set; }
public virtual Site Site { get; set; }
public virtual ContractType ContractType { get; set; }
}
在您的 DbContext
文件覆盖方法 OnModelCreating
中,至少有一个关系必须配置为在删除时不级联。该关系必须在删除时明确处理
protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
base.OnModelCreating( modelBuilder );
modelBuilder.Entity<Contract>()
.HasRequired( c => c.Site)
.WithMany( s => s.Contracts )
.WillCascadeOnDelete( false );
}