2017-02-22 69 views
0

我試圖理解和EF信任。 我有表的數據庫,我試圖複製與EFCode-First技術大部分結構作爲練習練習自己的基礎知識。多DataAnnotation ForeignKeys循環或多個級聯路徑異常

我所有的課都「HB」作爲其名稱的前綴。 我想寫屬性名稱上沒有'Hb'的其他類的對象引用。

我的這個site

後續指令第一批實施的事業例外,如:

引進國外KEY約束 'FK_Common.HbZipcode_Common.HbCountry_CountryId' 表 'HbZipcode' 可能導致週期或多個級聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY 約束。無法創建約束或索引。請參閱前面的 錯誤。

[Required, ForeignKey("Country")] 
public int CountryId { get; set; } 
public virtual HbCountry Country { get; set; } 

[Required, ForeignKey("State")] 
public int StateId { get; set; } 
public virtual HbState State { get; set; } 

[Required, ForeignKey("City")] 
public int CityId { get; set; } 
public virtual HbCity City { get; set; } 

// This Foreignkey never throw exception 
[ForeignKey("Neighborhood")] 
public int? NeighborhoodId { get; set; } 
public virtual HbNeighborhood Neighborhood { get; set; } 

我做錯了,我看不到。
如果任何人都可以幫助我,那會很好。

編輯:

應用由通過plushpuffin解決方案後,一切都如預期。
下面的代碼:

var modelConfig = dbModelBuilder.Entity<HbZipcode>(); 
modelConfig 
    .HasRequired(zc => zc.Country) 
    .WithMany(c => c.Zipcodes) 
    .HasForeignKey(zc => zc.CountryId) 
    .WillCascadeOnDelete(false); 

modelConfig 
    .HasRequired(zc => zc.State) 
    .WithMany(s => s.Zipcodes) 
    .HasForeignKey(zc => zc.StateId) 
    .WillCascadeOnDelete(false); 

modelConfig 
    .HasOptional(zc => zc.Neighborhood) 
    .WithMany(n => n.Zipcodes) 
    .HasForeignKey(zc => zc.NeighborhoodId) 
    .WillCascadeOnDelete(false); 

Delete cascadeHbZipcodeHbCity被刪除

現在只發生

回答

1

這裏發生的事情是,HbZipCode有外鍵的多個表,你不能創建2+外鍵具有ON CASCADE DELETE的約束,可以使用多種方法從同一個表中刪除相同的行。

這很可能是您的實體類被設置爲當HbZipCode被刪除時,它會將刪除級聯到HbNeighborhood,然後是HbCity,然後是HbState,然後是HbCountry。如果在ON CASCADE DELETE指向HbCity的情況下向HbZipCode添加了另一個外鍵,則刪除HbZipCode記錄將導致直接級聯刪除到HbNeighborhood並直接級聯刪除到HbCity,但HbNeighborhood被刪除將會導致級聯刪除至HbCity。

你需要做的是解決多階通過關閉CASCADE刪除大部分刪除路徑HbCity和其他實體類型。

this MSDN page上一口流利的配置。

這可能是你想要的東西是這樣的:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<HbZipCode>() 
     .HasRequired(t => t.HbCity) 
     .WithMany(t => t.HbZipCodes) 
     .HasForeignKey(t => t.CityId) 
     .WillCascadeOnDelete(false); 
} 
+0

我說錯刪除的方向。這是HbNeighborhood(等)被刪除,將級聯刪除HbZipCode。對於那個很抱歉。 – plushpuffin

+0

所以我想象它是建議刪除所有「CASCADE」約束和明確的更新和刪除對象現在......對嗎? –

+0

您可能希望在最直接的路徑上保留一組具有級聯刪除的觸發器。這一切都取決於你的需求。 – plushpuffin

相關問題