2012-03-14 30 views
0

我已经查看了这一个,我认为我已经完成了我需要的所有工作,以解决此问题。显然不是。引入FOREIGN KEY约束可能会导致周期或多个级联路径

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

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

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

表上引进国外KEY约束'FK_Destinations_DestinationRegions_DestinationRegionID“目的地”可能会导致周期或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。 无法创建约束。查看以前的错误。

这些都是使用EF Code First完成的。

我有一个国家类:

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 DestinationRegion 
{ 

    public int ID { get; set; } 
    [Required(ErrorMessage = " ")] 
    [DisplayName("Country")] 
    public int DestinationCountryID { get; set; } 
    public string Name { get; set; } 
    public virtual DestinationCountry DestinationCountry { get; set; } 
} 

和地图:

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 Destination 
{ 

    public int ID { get; set; } 
    [Required(ErrorMessage = " ")] 
    [DisplayName("Country")] 
    public int DestinationCountryID { get; set; } 
    public int DestinationRegionID { get; set; } 
    public string Name { get; set; } 
    public virtual DestinationCountry DestinationCountry { get; set; } 
    public virtual DestinationRegion DestinationRegion { get; set; } 
} 

和地图:

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); 
    } 
} 

可能有人请告诉我如何,我这样做是错误的。

+0

看来这是行不通的。重要的是要记住添加地图(哎呦): \t modelBuilder.Configurations.Add(new DestinationMap()); \t modelBuilder.Configurations.Add(new DestinationCountryMap()); \t modelBuilder.Configurations。添加(新的DestinationRegionMap()); 我还将“WithRequiredPrincipal”更改为“WithRequiredDependent”。 – 2012-03-14 19:50:13

回答

2

SQL Server有一个非常简单的级联删除模型。它无法应付您在此处指定的内容:如果删除国家/地区,则可以直接删除目的地,也可以通过中间区域删除目的地(因此可引用多个级联路径)。

如果可以的话,你应该考虑重新组织,使每个国家至少有一个区域(即使它是一个虚拟区域),并且每个目的地只属于一个区域(并且与国家没有直接联系) 。然后,所有删除可以遵循单一路径(国家 - >地区 - >目的地)。

+0

难道说“WillCascadeOnDelete(false)”只是一个谎言吗? 我明白你在说什么,除非我正在为一个我无法控制的CMS做这件事。因为我不会输入数据。此外,导航将使用此模型构建,因此,如果一个国家没有地区,它只显示目的地。 这样做真的没有办法吗? – 2012-03-14 08:56:13

0

看起来我所做的只是“WithRequiredPrincipal”到“WithRequiredDependent”的小改动。但最重要的是,我需要在modelBuilder.Configuration中包含我的映射类。

相关问题