質問: new HashSet(); } public int BlogId { get; set; } public string Url { get; set; } public virtual ICollection Post { get; set; } } ``` 最初の例は非常にシンプルで非常に明白なPOCOクラスです。これはドキュメントのどこにでも表示されます(データベースから生成されたサンプルを除く)。しかし、2番目の例では、いくつかの追加があります: * クラスは**部分的に**宣言されています(ただし、別の**部分的な**定義はありません)。 * ナビゲーションプロパティはList の代わりに**ICollection **型**です** 。 * ナビゲーションプロパティは、コンストラクタの**新しいHashSet ()**に初期化されます。このような初期化はコードの最初の例ではありません。 * ナビゲーションプロパティは**仮想**として宣言され**ます** 。 * 生成されたコンテキストクラスのDbSetメンバも**仮想**です。 私はデータベースからモデルをスカッフォールディング(この記事の執筆時点では最新のツール)しようとしましたが、表示されているとおりにエンティティが生成されるため、これは古いドキュメントの問題ではありません。公式のツールでは異なるコードが生成され、公式のドキュメントでは、部分クラス、仮想メンバ、構造の初期化などをせずに、異なる(些細な)コードを書くことが提案されています。 私の質問は、コードでモデルを構築しようとすると、私はどのようにコードを書くべきですか?私はListの代わりにICollectionを使うのが好きですが、これは一般的ですが、それ以外には、私がドキュメントやMSツールに従う必要があるかどうか分からないのですか?それらを仮想として宣言する必要がありますか?コンストラクタで初期化する必要がありますか?等... 私は古いEF時代から、仮想ナビゲーションプロパティで遅延ロードを許可していることは分かっていますが、EFコアでは(まだ)サポートされていませんし、他の用途についてはわかりません。多分それはパフォーマンスに影響を与えますか?たぶんツールは、遅延保証が実装されるときに、POCOのクラスとコンテキストがそれをサポートできるように、将来保証されたコードを生成しようとしますか?もしそうなら、私は遅延ロードを必要としないのでそれらを取り除くことができますか?(すべてのデータクエリはリポジトリにカプセル化されています) まもなく、なぜ違いがあるのか、コードでモデルを構築するときにどのスタイルを使用すべきかを理解してください。
回答: 私はあなたが言及した各ポイントに短い答えを出そうとします * `partial`クラスは、ツール生成コードに特に便利です。モデルのみの派生プロパティを実装するとします。コードの場合は、まずどこでも好きなようにしてください。データベースを最初に更新する場合は、クラスファイルが書き直されます。したがって、拡張コードを保持したい場合は、それをマネージドモデル外の別のファイルに配置する必要があります。これは、 `partial` 、自動生成されたコードを手動で調整することなくクラスを拡張するのに役立ちます。 * `ICollection`は、コードであっても、間違いなく適切な選択`ICollection` 。あなたのデータベースは、ソートステートメントなしでは、おそらく定義された注文をサポートしないでしょう。 * コンストラクタの初期化は、少なくとも便利です。空のコレクションがデータベースに似ているか、プロパティをまったく読み込まなかったとします。コンストラクタがなければ、コード内の任意の点で明示的に`null`を処理する必要があります。 `List`か`HashSet`どちらを使うべきかは、今私が答えることができないものです。 * `virtual`は、データベースエンティティのプロキシ作成を可能にします。これは、すでに述べたようにレイジーローディングとトラッキングを変更するという2つの点で役に立ちます。プロキシオブジェクトは、セッターで直ちに仮想プロパティの変更を追跡できますが、コンテキスト内の通常のオブジェクトは`SaveChanges`で検査する必要があります。場合によっては、これがより効率的になる場合があります(一般的ではありません)。 * `virtual IDbSet`コンテキストエントリにより、単体テストのテストモックアップコンテキストの設計が容易になります。他のユースケースも存在する可能性があります。