3

アプリケーションでEF5(コードファースト)を使用しています。いくつかの遅延読み込みフィールドを含むテーブルがあります。

public class TestEntity
{
    public int Id { get; set; }

    public virtual TestEntity2 SubEntity2 { get; set; }
    public virtual TestEntity3 SubEntity3 { get; set; }

    private ICollection<SubEntity4> _subEntities;
    public ICollection<SubEntity4> SubEntities
    {
        get { return _subEntities ?? (_subEntities = new Collection<SubEntity4>()); }
        protected set { _subEntities = value; }
    }
}

これをデータベースから読み取っているとき、SubEntity2とSubEntity3は正常に読み込まれていますが、SubEntitiesコレクションは読み込まれず、常にCount=0のままです。だから私はこのような負荷を強制しています:

db.Entry(queryResult).Collection(rr => rr.SubEntities).Load();

しかし、私が理解しているように、このコレクションは、SubEntity2やSubEntity3と同様に、最初の呼び出し時にEFによって自動的にロードされる必要があります。コレクションで動作しないのはなぜですか?

データベースの読み取りに使用しているコードの例:

using (var db = new TestContext(_connection, false))
        {
            var query = from r in db.SubEntities
                        where r.Id == 10
                        select r;

            var queryRes = query.FirstOrDefault();
            if (queryRes != null)
            {
                if (queryRes.FederalRegion != null)
                {
                    // Do something
                }

                foreach (var dbEnt in queryRes.SubEntities)
                {
                    // Do something
                }
            }
        }
4

3 に答える 3

8

遅延読み込みが機能するためには、EF5はいくつかのトリッキーな作業を行う必要があります。実行時に、モデルクラスから派生したプロキシクラスを作成します。これらのプロキシクラス内では、ナビゲーションプロパティをオーバーライドして、遅延読み込みメカニズムを実装します。

プロパティは仮想SubEntity2SubEntity3あるため、オーバーライドできます。プロパティは仮想ではありませSubEntitiesん-EF5は、このプロパティをオーバーライドして遅延読み込みを実装することはできません。

SubEntitiesプロパティを仮想化すると、機能するはずです。

于 2013-03-13T12:59:52.330 に答える
0

あなたがそれら(コレクション)を説明するときの「サブエンティティ」は、その性質によって遅延ロードされます。それらを遅延ロードしたくない場合は、.Include(x=> x.SubEntitiesCollectionName)extensionメソッドを使用する必要があります。

編集

クラスは次のようになります。

public class TestEntity
{
    public int Id { get; set; }    
    public virtual TestEntity2 SubEntity2 { get; set; }
    public virtual TestEntity3 SubEntity3 { get; set; }    
    public virtual ICollection<SubEntity4> SubEntities { get; set; }
}
于 2013-03-13T13:00:01.240 に答える
0

遅延読み込みを有効にするには、フィールドを作成する必要がありますvirtual。それは本当です。しかし、別の問題もあります。あなたはあなたのICollection<SubEntity4>ように持っていますprivate。そのため、マッパーはフィールドにアクセスできなくなります。同様の問題があり、エンティティのプライベートフィールドをマッパーに表示するように設定する方法について質問しました。答えは-「不可能だ」です!ここにリンクがあります:

エンティティのプライベートプロパティのマッピングを有効にする方法

だからちょうどこのようにしてください:

   public virtual ICollection<SubEntity4> SubEntities {get;set};

とあなたの財産を削除します。

于 2013-03-13T13:14:23.727 に答える