22

CTP5 に付属する DbContext T4 テンプレートには関連付けの修正がなく、すべてのプロパティが仮想としてマークされているわけではありません。コンテキストから切断されたときに ChangeTracking をサポートしないということですか? まず第一に、コンテキストによって (動的プロキシを介して) 追跡されている場合でも、ChangeTracking をサポートしていますか? 変更追跡の要件は、すべてのプロパティを仮想としてマークする必要があることです。

EF4 POCO ジェネレーターと比較して、DbContext ジェネレーターを使用すると機能が失われますか?

どんな反応でも大歓迎です。

4

3 に答える 3

1

DbContext Generator を使用して生成されたクラスは、http://blogs.msdn.com/b で説明されているように、「変更追跡プロキシ」ではなく「遅延読み込みプロキシ」のみを使用すると思います (プロキシには 2 種類あることに注意してください) 。 /adonet/archive/2009/12/22/poco-proxies-part-1.aspx . ご指摘のとおり、変更追跡プロキシが機能するには、マップされたすべてのプロパティが仮想である必要があります。これは、遅延読み込みプロキシ (ナビゲーション プロパティのみが仮想である必要がある場合) には必要ありません。

Microsoft は T4 テンプレートでこれを変更する必要があると思います。なぜなら、変更追跡プロキシがなければ、はるかに遅くなるからです。特に、オブジェクト コンテキストに多数のエンティティがある場合。

これを確認できました。本のプログラミング エンティティ フレームワーク: DbContext の 66 ページで、これについて説明しています。次のようなコードを使用して、オブジェクトが変更追跡プロキシを使用していることを確認できます。

Person p = context.People.Find(123);
bool b = p is IEntityWithChangeTracker;

T4 テンプレートがデフォルトですべてのプロパティを仮想化していないことに驚いています。なんらかの理由で故意にやったという理由がない限り、奇妙な見落としのように思えます。

于 2012-04-30T19:22:01.500 に答える
1

そのすべては熱心で怠惰な読み込みです。これを見てください

http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx

    public class Person
    {
        public int Id { get; set; }
        public virtual Address Address { get; set; }
        // ...
    }

    public class Address
    {
        public int Id { get; set; }
        public string AddressLine1 { get; set; }
        // ...
    }

    static void Main(string[] args)
    {
        MyDatabaseContext db = new MyDatabaseContext();
        Person person = db.Persons.Where(x => x.Id == 1).First();
        // person.Address is loaded if the propertie Address, class Person 
        // is marked as virtual. If NOT its null.
    }
于 2011-10-21T07:55:41.070 に答える
0

仮想としてマークされたプロパティは、別のエンティティ タイプのプロパティです。stringなどのプロパティintは仮想としてマークされることはありません。

于 2011-07-15T21:57:33.737 に答える