2017-02-22 10 views
0

私はEFを理解し、信頼しようとしています。 私はテーブルを持つデータベースを持っており、基本を実践するための練習としてEFCode-First技術を使ってほとんどの構造を複製しようとしています。複数のDataAnnotation ForeignKeysサイクルまたは複数のカスケードパス例外

すべてのクラスには、名前に「Hb」という接頭辞が付きます。 プロパティ名に 'Hb'を付けずにオブジェクト参照を他のクラスに書きたいと思います。引き起こす可能性が

がテーブルの上にFOREIGN KEY制約 'FK_Common.HbZipcode_Common.HbCountry_CountryId' を紹介 'HbZipcode' :

私はこのsite

のフォロー命令などの最初の実装の原因の例外ですサイクルまたは複数のカスケード・パス。 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 から渡された溶液を塗布した後、すべてが行ってきました。
ここでは、コードです:HbZipcode

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 cascadeHbCityが削除された場合にのみ、ここで何が起こっている

答えて

1

がHbZipCodeが複数のテーブルへの外部キーを持っているということです、そしてあなたが外部キー2+を作成することはできません発生したが、同じ表から同じ行を削除する複数の方法があるON CASCADE DELETEの制約。

エンティティクラスは、HbZipCodeが削除されると、HbNeighborhood、HbCity、HbState、HbCountryにカスケードされるように設定されている可能性があります。 HbZipCodeレコードを削除すると、HbZipCodeレコードを削除すると、HbNeighborhoodへの直接カスケード削除とHbCityへの直接カスケード削除が発生しますが、削除されるHbNeighborhoodはでも HbCityへのカスケード削除。

ほとんどの場合、CASCADE DELETEをオフにして、複数のカスケード削除パスを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

関連する問題