4

以下の例のように、VS2010、EF4 機能 CTP (最新リリース)、および POCO オブジェクトを使用しています。

class Person
{
 public int ID { get; set; }
 public string Name { get; set; }
 public virtual IList<Account> Accounts { get; set; }
 ...
}

class Account
{
 public string Number { get; set; }
 public int ID { get; set; }
 ...
}

簡潔にするために、context以下が EF4 のコンテキスト オブジェクトであると仮定します。エンティティ タイプとデータベースの間に dbml マッピングがあり、次のように問題なく使用できます。

Person doug = context.Persons.CreateObject();
doug.Name = "Doug";    
context.Add(doug);
context.Save();
doug.Accounts.Add(new Account() { Name = "foo" });
context.Save(); // two calls needed, yuck

この時点で、データベースには "Doug" という名前の Person レコードと、アカウント レコード "foo" があります。これらのレコードをクエリして取得できます。しかし、Person を保存する前にアカウントを追加しようとすると、Accounts リストは null になります (プロキシはそのプロパティのインスタンスをまだ作成していません)。次の例を参照してください。

Person doug = context.Persons.CreateObject();
doug.Name = "Doug";
doug.Accounts.Add(new Account() { Name = "foo" }); // throws null reference exception
context.Add(doug);
context.Save();

他の誰かがこれに遭遇しましたか?さらに良いことに、誰かが良い解決策を見つけましたか?

4

3 に答える 3

3
Person doug = context.Persons.CreateObject();

doug.Name = "Doug";

context.Add(doug);
doug.Accounts.Add(new Account() { Name = "foo" });
context.Save();

これはうまくいきます

于 2010-11-21T23:06:54.007 に答える
2

はい、はい!

(コンテキストからの CreateObject とは対照的に) POCO を新規作成すると、プロキシは提供されません。これは当然のことのように思えるかもしれませんが、同様の問題を追跡するときに、この動作を明示的に思い出さなければなりませんでした。(これは質問で説明した状況ではないことはわかっていますが、全体的な問題は認められるべきです)。

POCO のコンストラクターでコレクションを初期化しても、適切な EF4 プロキシの遅延読み込み動作が妨げられることはありません。これは、私自身のテストで確認したことです。

OK、これがすべて述べられているので、前の回答に対するあなたのコメントが表示されました。コンテキストから新しい Person を要求するときに、プロキシされた Addresses コレクションがないのはなぜですか? コンテキストで遅延読み込みを有効にしていますか? ナビゲーション プロパティをどのように扱っているかを見て、遅延読み込みをオフにすると、この状況で違いが生じる可能性があることがわかりました。

于 2010-01-06T16:27:08.337 に答える
1

フレームワークがこれらすべてを実行することを期待する場合、実際には「POCO」はありませんよね? Person上記のコードを使用して、クラスを受講してください。AccountsEF が関与していない場合、コンストラクターがない場合、プロパティの構築後の状態はどのようなものになると予想されますか? CLRはそれらがnullであることを保証するように思えます。

はい、DB 値の実体化に必要な場合、プロキシはこれを初期化できますが、EF では、「POCO」は実際には「プレーン」を意味します。「「プレーン」であるふりをする、実行時に生成されたコードが詰め込まれたもの」ではありません。

于 2010-01-05T14:07:11.873 に答える