1

一部のコードのリファクタリングを完了したところですが、今DbContext行った変更の影響を受けるべきではない次の計算コードを保存すると、このエラーが発生します。

エラーは次のとおりです。

{"タイプ 'System.Collections.Generic.List`1[_3T.NewDomain.Quote.Pricing.PriceLineItem]' のオブジェクトをタイプ '_3T.NewDomain.Quote.Pricing.PriceLineItem' にキャストできません。"}

次の呼び出し時にトリガーされます。DbContext.SaveChanges()

かなり時間がかかると予想されるデバッグ プロセスに着手します。しかし、コードが正常にコンパイルされる方法について、私は完全に困惑しています。それでも、DbContextリストを単一のインスタンス変数に割り当てようとしています。

このようなことにつながる可能性のある落とし穴はありますか? 私は何を見落としましたか?

4

1 に答える 1

2

私は答えを見つけました。他の人に役立つ場合に備えて、ここに投稿しています。

エラーが 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) は、このエントリを完全に削除することです。プロパティ名が使用されているため、構成よりも規則がこの関係定義を十分に処理します

于 2013-11-11T10:51:58.097 に答える