Asp.net mvc 3 引入外键约束可能会导致循环或多个级联路径
我环顾了一下这个问题,我想我已经做了我需要做的一切来解决这个问题。显然不是 基本上我有一个国家,地区,目的地。每个地区都必须属于一个国家。每个目的地必须属于一个国家。目的地可能属于某个区域 国家>地区>目的地 或 国家>目的地 当我的代码首先创建数据库时,我得到了臭名昭著的: 在表“Destinations”上引入外键约束“FK\u DestinationRegions\u DestinationRegionID”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束。 无法创建约束。请参阅前面的错误 这一切都是使用EF代码首先完成的 我有一个国家班:Asp.net mvc 3 引入外键约束可能会导致循环或多个级联路径,asp.net-mvc-3,model,foreign-key-relationship,Asp.net Mvc 3,Model,Foreign Key Relationship,我环顾了一下这个问题,我想我已经做了我需要做的一切来解决这个问题。显然不是 基本上我有一个国家,地区,目的地。每个地区都必须属于一个国家。每个目的地必须属于一个国家。目的地可能属于某个区域 国家>地区>目的地 或 国家>目的地 当我的代码首先创建数据库时,我得到了臭名昭著的: 在表“Destinations”上引入外键约束“FK\u DestinationRegions\u DestinationRegionID”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,
public class DestinationCountry
{
public int ID { get; set; }
public bool Active { get; set; }
[Required(ErrorMessage=" ")]
[DisplayName("Country")]
public string Name { get; set; }
}
和一张地图:
public class DestinationCountryMap : EntityTypeConfiguration<DestinationCountry>
{
public DestinationCountryMap()
{
// Primary Key
this.HasKey(t => t.ID);
// Properties
this.Property(t => t.Name)
.IsRequired()
.HasMaxLength(256);
this.ToTable("DestinationCountry");
this.Property(t => t.ID).HasColumnName("ID");
}
}
public class DestinationRegionMap : EntityTypeConfiguration<DestinationRegion>
{
public DestinationRegionMap()
{
// Primary Key
this.HasKey(t => t.ID);
// Properties
this.Property(t => t.Name)
.IsRequired()
.HasMaxLength(256);
this.ToTable("DestinationRegion");
this.Property(t => t.ID).HasColumnName("ID");
this.Property(t => t.DestinationCountryID).HasColumnName("DestinationCountryID");
// Relationships
this.HasRequired(t => t.DestinationCountry)
.WithRequiredPrincipal()
.WillCascadeOnDelete(false);
}
}
public class DestinationMap : EntityTypeConfiguration<Destination>
{
public DestinationMap()
{
// Primary Key
this.HasKey(t => t.ID);
// Properties
this.Property(t => t.Name)
.IsRequired()
.HasMaxLength(256);
this.ToTable("Destination");
this.Property(t => t.ID).HasColumnName("ID");
this.Property(t => t.DestinationCountryID).HasColumnName("DestinationCountryID");
this.Property(t => t.DestinationRegionID).HasColumnName("DestinationRegionID");
this.Property(t => t.Name).HasColumnName("Name");
// Relationships
this.HasRequired(t => t.DestinationCountry)
.WithRequiredPrincipal()
.WillCascadeOnDelete(false);
this.HasOptional(t => t.DestinationRegion)
.WithOptionalPrincipal()
.WillCascadeOnDelete(false);
}
}
和一张地图:
public class DestinationCountryMap : EntityTypeConfiguration<DestinationCountry>
{
public DestinationCountryMap()
{
// Primary Key
this.HasKey(t => t.ID);
// Properties
this.Property(t => t.Name)
.IsRequired()
.HasMaxLength(256);
this.ToTable("DestinationCountry");
this.Property(t => t.ID).HasColumnName("ID");
}
}
public class DestinationRegionMap : EntityTypeConfiguration<DestinationRegion>
{
public DestinationRegionMap()
{
// Primary Key
this.HasKey(t => t.ID);
// Properties
this.Property(t => t.Name)
.IsRequired()
.HasMaxLength(256);
this.ToTable("DestinationRegion");
this.Property(t => t.ID).HasColumnName("ID");
this.Property(t => t.DestinationCountryID).HasColumnName("DestinationCountryID");
// Relationships
this.HasRequired(t => t.DestinationCountry)
.WithRequiredPrincipal()
.WillCascadeOnDelete(false);
}
}
public class DestinationMap : EntityTypeConfiguration<Destination>
{
public DestinationMap()
{
// Primary Key
this.HasKey(t => t.ID);
// Properties
this.Property(t => t.Name)
.IsRequired()
.HasMaxLength(256);
this.ToTable("Destination");
this.Property(t => t.ID).HasColumnName("ID");
this.Property(t => t.DestinationCountryID).HasColumnName("DestinationCountryID");
this.Property(t => t.DestinationRegionID).HasColumnName("DestinationRegionID");
this.Property(t => t.Name).HasColumnName("Name");
// Relationships
this.HasRequired(t => t.DestinationCountry)
.WithRequiredPrincipal()
.WillCascadeOnDelete(false);
this.HasOptional(t => t.DestinationRegion)
.WithOptionalPrincipal()
.WillCascadeOnDelete(false);
}
}
和一张地图:
public class DestinationCountryMap : EntityTypeConfiguration<DestinationCountry>
{
public DestinationCountryMap()
{
// Primary Key
this.HasKey(t => t.ID);
// Properties
this.Property(t => t.Name)
.IsRequired()
.HasMaxLength(256);
this.ToTable("DestinationCountry");
this.Property(t => t.ID).HasColumnName("ID");
}
}
public class DestinationRegionMap : EntityTypeConfiguration<DestinationRegion>
{
public DestinationRegionMap()
{
// Primary Key
this.HasKey(t => t.ID);
// Properties
this.Property(t => t.Name)
.IsRequired()
.HasMaxLength(256);
this.ToTable("DestinationRegion");
this.Property(t => t.ID).HasColumnName("ID");
this.Property(t => t.DestinationCountryID).HasColumnName("DestinationCountryID");
// Relationships
this.HasRequired(t => t.DestinationCountry)
.WithRequiredPrincipal()
.WillCascadeOnDelete(false);
}
}
public class DestinationMap : EntityTypeConfiguration<Destination>
{
public DestinationMap()
{
// Primary Key
this.HasKey(t => t.ID);
// Properties
this.Property(t => t.Name)
.IsRequired()
.HasMaxLength(256);
this.ToTable("Destination");
this.Property(t => t.ID).HasColumnName("ID");
this.Property(t => t.DestinationCountryID).HasColumnName("DestinationCountryID");
this.Property(t => t.DestinationRegionID).HasColumnName("DestinationRegionID");
this.Property(t => t.Name).HasColumnName("Name");
// Relationships
this.HasRequired(t => t.DestinationCountry)
.WithRequiredPrincipal()
.WillCascadeOnDelete(false);
this.HasOptional(t => t.DestinationRegion)
.WithOptionalPrincipal()
.WillCascadeOnDelete(false);
}
}
公共类DestinationMap:EntityTypeConfiguration
{
公共目的地图()
{
//主键
this.HasKey(t=>t.ID);
//性质
this.Property(t=>t.Name)
.IsRequired()
.HasMaxLength(256);
本表为ToTable(“目的地”);
this.Property(t=>t.ID).HasColumnName(“ID”);
this.Property(t=>t.DestinationCountryID).HasColumnName(“DestinationCountryID”);
this.Property(t=>t.DestinationRegionID).HasColumnName(“DestinationRegionID”);
this.Property(t=>t.Name).HasColumnName(“Name”);
//关系
this.HasRequired(t=>t.DestinationCountry)
.WithRequiredPrincipal()
.WillCascadeOnDelete(假);
this.HasOptional(t=>t.DestinationRegion)
.WithOptionalPrincipal()
.WillCascadeOnDelete(假);
}
}
有人能告诉我我是怎么做的吗。SQL Server有一个非常简单的级联删除模型。它无法处理您在此处指定的内容:如果删除一个国家/地区,则可以直接或通过中间区域删除目的地(因此引用多个级联路径)
如果你可以,你应该考虑重新组织,这样每个国家至少有一个地区(即使它是一个傀儡地区),而且每个目的地只属于一个地区(而且与国家没有直接的联系)。然后,所有的删除都可以遵循一条路径(国家->地区->目的地)。似乎我所做的只是将“WithRequiredPrincipal”稍微更改为“WithRequiredDependent”。但最重要的是,我需要在modelBuilder.Configuration中包含映射类。说“WillCascadeOnDelete(false)”只是个谎言吗?我明白你的意思,但我这样做是为了一个我无法控制的CMS。如中所示,我不会输入数据。除此之外,导航将使用此模型构建,因此当一个国家没有地区时,它只显示目的地。真的没有办法这样做吗?看来这样做行得通。重要的是要记住添加映射(哎呀):modelBuilder.Configurations.add(newdestinationmap());添加(新DestinationCountryMap());添加(newdestinationRegionMap());我还将“WithRequiredPrincipal”改为“WithRequiredDependent”。