0

ToSting メソッドをオーバーライドし、そのエンティティの新しいインスタンスが作成されたときにいくつかの基本的なプロパティ設定を提供する部分クラスを作成したエンティティで奇妙な動作が見られます (たとえば、注文日を'Now') をコンストラクターで使用します。

この奇妙な動作により、部分クラスを詳しく調べたところ、既存の一連のレコードが取得されている場合でも、取得された各レコードに対してコンストラクターが呼び出されていることに驚きました。

以下は、私が持っているかもしれないものの非常に簡単な例です:

Partial Public Class Product


Public Sub New()

    CostPrice = 0.0
    ListPrice = 0.0 

End Sub
Public Overrides Function ToString() As String
    Return ProductDescription
End Function
End Class

このことから、次の 2 つの疑問が生じます。

1)コンストラクターを追加する部分クラスを追加した場合、これはEntity Frameworkでの通常の動作ですか?

2) そうでない場合、私は何か間違ったことをしたと仮定しなければならないので、上記の例と同様のことを行うためにコンストラクターをオーバーライドする正しい方法は何でしょうか?

あなたが私に与えることができる洞察に感謝します。

これはvbプロジェクトでEF 5.0を使用しています

4

2 に答える 2

1

データベースからエンティティを取得する一連のイベントを考えてみてください。基本的には次のようになります。

  • データベースに問い合わせる
  • クエリ結果の各行に対してエンティティを与える

取得された行ごとに次のように与えられます。

  • 取得したエンティティの新しいインスタンスを作成します
  • この新しいインスタンスに行の値を入力します

インスタンスが作成されるたびに、コンストラクターが呼び出されます。

私はあなたが混合していると思います:

  • オブジェクトを「割り当てる」インスタンスの初期化、および
  • ビジネスロジックを適用するビジネスの初期化

どちらも、コンストラクターで少なくとも部分的に実行できます。

于 2013-07-23T10:22:25.517 に答える
0

newクラスが最初にインスタンス化されるときに常に呼び出され、コンストラクターを明示的に宣言しない場合は、コンパイラーによってデフォルトのコンストラクターが作成されます

クラスが静的でない限り、コンストラクターのないクラスには、クラスのインスタンス化を有効にするために、C# コンパイラーによってパブリックの既定のコンストラクターが与えられます。

Entity Framework の POCO クラスを定義する場合、クラスには既定のコンストラクターが必要であり、EF は、明示的に定義した場合でも、コンパイラーによって実行された場合でも、常にこの既定のコンストラクターを呼び出します。

なんらかの理由でインスタンス化時にクラスに何かを渡す必要がある場合は、 eventを使用ObjectContext.ObjectMaterializedできます。

于 2013-07-23T10:31:03.077 に答える