Entity Framework 6.0 を使用して、テーブル分割を実装して、BLOB データを含む列を持つテーブルのクエリ パフォーマンスを改善しようとしています。このチュートリアルの推奨事項に従っていますが、実際に説明どおりに機能します。
これは、私の分割テーブルの 1 つにマップされるエンティティ クラスの非常に単純化された例です ...
public class MyEntity
{
public string Id { get; set; }
public virtual MyEntityContent Content { get; set; }
public string Name { get; set; }
}
public class MyEntityContent
{
public string Id { get; set; }
public virtual MyEntity Entity { get; set; }
public byte[] Blob { get; set; }
}
DbContext
... および関連する実装内の対応する構成コード...
modelBuilder.Entity<MyEntity>().HasKey(e => e.Id).ToTable("MyEntities");
modelBuilder.Entity<MyEntityContent>().HasKey(c => c.Id).ToTable("MyEntities");
modelBuilder.Entity<MyEntity>().HasRequired(e => e.Content).WithRequiredPrincipal(d => d.Entity);
遅延読み込みContent
プロパティがRequired
Entity Framework によるものであることを考えると、それを含むMyEntity
クラスのコンストラクターで既定値に初期化するのが賢明なようです ...
public MyEntity()
{
Content = new MyEntityContent();
}
...これにより、必要なプロパティ値の初期化を忘れて例外がスローされるリスクなしに、クラスの新しいインスタンスを作成して部分的に設定できます。
var entity = new MyEntity {Id = "XXX", Name = "something"};
私は通常、同様の手法を使用して EF エンティティのコレクション プロパティを初期化し、正常に動作します。ただし、上記のシナリオでは、コンストラクターでのこの初期化には予期しない効果があります。データベースから既存のエンティティ インスタンスを取得するとき、遅延読み込みプロパティのデータベース値は無視され、空の既定値が優先されます。
これは私には非論理的に思えます。Entity Framework は、最初に既定のコンストラクターを呼び出してから、作成されたインスタンスに独自のプロパティ値を適用することによって、エンティティ オブジェクトを作成しませんか? もしそうなら、これは私のデフォルトContent
のプロパティ値を、MyEntityContent
データベースのデータに基づいて の新しいインスタンスで上書きする必要があります。これは、遅延ロードされたコレクション プロパティで動作するように見える方法です。
私が期待している方法でこれを行うことができない場合、遅延ロードされたプロパティを初期化するための代替手法はありますか?