4

Entity Framework 4 を使用する大規模なアプリケーションを Entity Framework 5 にアップグレードしようとしています。次のような関数を発見しました。

public FooModel(FooEntity foo)
{
    _foo = foo;
    _foo.bars.Load(System.Data.Objects.MergeOption.OverwriteChanges);
}

foobarは生成されたエンティティでありbar、 への外部キーがありfooます。

EF5 にはその機能がなくなった.Load(MergeOption)ようで、今まで見たことがありません。誰がそれが何をしているのか、そしてそれに相当するものを知っていますか?

https://stackoverflow.com/a/13178313/784908は、それが DbContext の一部であることを示唆していますLoadが、私のエンティティ コンテナーは DbContext から継承されており、まだ利用できません


私の最善の推測は、外部キーの Eager ロードに使用されることです (これを行う必要があります。コンテキストはリクエストで何度も作成および破棄されます。FooModel が使用されたときにコンテキストが存在/アタッチされるという保証はありません)。

Entity Framework - 関連エンティティの熱心な読み込みは、使用する必要があることを示して.Include()いますが、その関数は実際のエンティティでは使用できないようです (この用語は「具体化されたクエリ」だと思いますか?)

読んでくれてありがとう

4

1 に答える 1

1

.Load()IQueryableデータベースからメモリにクエリをロードします。実際にLocalは、DbContext の関連エンティティのプロパティです。

このメソッドは、DbContext だけでなく、任意の IQueryable コレクションで使用できます。例は次のとおりです。

var q = db.Products.Include("Category").ToList();
q.Load(); // -> you can't!

// ------------

db.Products.Include("Category").Load(); // It's OK!

// This will NOT query the database, just looks in-memory data.
var p = db.Products.Local.Single(id); 

// ------------

var q = db.Products.Include("Category").ToList();
q.AsQueryable().Load(); // -> It's OK!

// This also will NOT query the database, just looks in-memory data.
var p = db.Products.Local.Single(id); 

load 関数は、主に次の 2 つの理由で使用されます。

1) データの一部を Db からメモリに取得して操作する:

db.Products.Include("Category").Where(p => p.CatId == 10).Load();

2) L2E がサポートしていない Linq-to-Objects メソッド (.ToString() など) を使用できるようにするため - DbContext エンティティの Local プロパティとして、L2O オブジェクトと同様にObservableCollection<T>を実装します。IEnumerable

db.Products.Include("Category").Where(p => p.CatId == 10).Load();
string subName = db.Products.Local.Find(id).SubString(0, 4);
于 2013-08-03T11:11:27.430 に答える