2012-03-14 32 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中包含我的映射類。

相關問題