3

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プロパティがRequiredEntity Framework によるものであることを考えると、それを含むMyEntityクラスのコンストラクターで既定値に初期化するのが賢明なようです ...

public MyEntity()
{
    Content = new MyEntityContent();                
}

...これにより、必要なプロパティ値の初期化を忘れて例外がスローされるリスクなしに、クラスの新しいインスタンスを作成して部分的に設定できます。

var entity = new MyEntity {Id = "XXX", Name = "something"};

私は通常、同様の手法を使用して EF エンティティのコレクション プロパティを初期化し、正常に動作します。ただし、上記のシナリオでは、コンストラクターでのこの初期化には予期しない効果があります。データベースから既存のエンティティ インスタンスを取得するとき、遅延読み込みプロパティのデータベース値は無視され、空の既定値が優先されます。

これは私には非論理的に思えます。Entity Framework は、最初に既定のコンストラクターを呼び出してから、作成されたインスタンスに独自のプロパティ値を適用することによって、エンティティ オブジェクトを作成しませんか? もしそうなら、これは私のデフォルトContentのプロパティ値を、MyEntityContentデータベースのデータに基づいて の新しいインスタンスで上書きする必要があります。これは、遅延ロードされたコレクション プロパティで動作するように見える方法です。

私が期待している方法でこれを行うことができない場合、遅延ロードされたプロパティを初期化するための代替手法はありますか?

4

1 に答える 1

0

仮想メンバーを初期化しないでください。おそらく、必要に応じて、初期化されていないメンバーからの例外を処理してください。

2 つの仮想フィールドを持つエンティティでこの問題が発生しました。もともとこれら2つを初期化していましたが、それらを削除した後(および他のフィールドをデフォルト値に初期化した後)、機能し始めました。それを試して、私に知らせてください!

[編集]少し古い投稿に返信したことに気づきました。日付が表示されていませんでした。念のため、この回答をここに残しておくと思います。

于 2014-03-19T19:15:27.353 に答える