Asp.net mvc 3 引入外键约束可能会导致循环或多个级联路径

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”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,

我环顾了一下这个问题,我想我已经做了我需要做的一切来解决这个问题。显然不是

基本上我有一个国家,地区,目的地。每个地区都必须属于一个国家。每个目的地必须属于一个国家。目的地可能属于某个区域

国家>地区>目的地 或 国家>目的地

当我的代码首先创建数据库时,我得到了臭名昭著的:

在表“Destinations”上引入外键约束“FK\u DestinationRegions\u DestinationRegionID”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束。 无法创建约束。请参阅前面的错误

这一切都是使用EF代码首先完成的

我有一个国家班:

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”。