私は答えを見つけました。他の人に役立つ場合に備えて、ここに投稿しています。
エラーが EF 関連であり、コードがコンパイルされたことを考えると、構成エラーである可能性が最も高いという仮定から始めました。
追加情報を提供するには:PriceLineItem
エラーの焦点にあるクラスは、ツリー構造を提供する内部でネストできます。PriceLineItem
など、を継承するクラスもありますIssuePriceLineItem
。
この新しいツリー構造を使い始めた早い段階でDbContext
、流暢な API を使用してクラスで次の構成を手動で定義しました。
modelBuilder.Entity<IssuePriceLineItem>()
.HasOptional(p => p.PriceLineItems)
.WithMany()
.HasForeignKey(c => c.ParentLineItemId);
いじくり回し段階からのこの遺物は、エラーが存在する場所です。多対多の関係を暗示していることがわかります。これは、この構成の 2 行目、または 2 行目と 3 行目を変更することで修正できます。
訂正 1:
modelBuilder.Entity<IssuePriceLineItem>()
.HasOptional(p => p.ParentLineItem)
.WithMany() /* implies ICollection<PriceLineItem> PriceLineItems */
.HasForeignKey(c => c.ParentLineItemId);
訂正 2:
modelBuilder.Entity<IssuePriceLineItem>()
.HasMany(p => p.PriceLineItems)
.WithOptional() /* implies ParentLineItem navigation property */
.HasForeignKey(c => c.ParentLineItemId);
PriceLineItem
いずれにせよ、この特定のケースでは、 and notを使用して自己参照として定義する必要がありましたIssuePriceLineItem
。最初から自己参照していた場合、誤った構成が以前に明らかになっていました。私の最近のリファクタリングがそれを開始するまで休眠状態に置く代わりに。
私の考えでは、最も安全な構成定義は、以下のように、より明示的に定義することです。
modelBuilder.Entity<PriceLineItem>()
.HasOptional(p => p.ParentLineItem)
.WithMany(p => p.PriceLineItems)
.HasForeignKey(c => c.ParentLineItemId);
ただし、最善の修正(IMO) は、このエントリを完全に削除することです。プロパティ名が使用されているため、構成よりも規則がこの関係定義を十分に処理します