Подтвердить что ты не робот

EntityFramework CTP5 DbContext T4 Шаблон "виртуальное" ключевое слово

Шаблон DbContext T4, который поставляется с CTP5, не имеет фиксирования ассоциации, и не все свойства помечены как виртуальные. Означает ли это, что он не поддерживает ChangeTracking при отключении от контекста? Прежде всего, поддерживает ли он ChangeTracking даже при отслеживании Context (через динамические прокси)? Я вижу, что требование отслеживания изменений состоит в том, что все свойства должны быть помечены как виртуальные.

Мы теряем функциональность с использованием генератора DbContext по сравнению с генератором POCO EF4?

Приветствуется любой ответ.

4b9b3361

Ответ 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.
    }

Ответ 2

Я думаю, что классы, созданные с помощью генератора DbContext, будут использовать только "ленивые прокси-серверы загрузки", а не "прокси-серверы отслеживания изменений" (обратите внимание, что существуют два типа прокси-серверов), как описано в http://blogs.msdn.com/b/adonet/archive/2009/12/22/poco-proxies-part-1.aspx. Как вы указали, все отображаемые свойства должны быть виртуальными, чтобы прокси-серверы отслеживания изменений работали. Это не требуется для ленивых прокси-серверов (где только свойства навигации должны быть виртуальными).

Я думаю, что Microsoft должна изменить это в шаблоне T4, потому что без прокси-серверов отслеживания изменений он намного медленнее. Особенно, если у вас много объектов в контексте объекта.

Я смог подтвердить это. В книге "Программирование Entity Framework: DbContext" на стр. 66 говорится об этом. Вы можете использовать код, подобный приведенному ниже, чтобы убедиться, что объект использует прокси-сервер отслеживания изменений.

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

Я удивлен, что шаблон T4 не делает все свойства виртуальными по умолчанию. Похоже на странный надзор, если нет причин, по которым они сделали это намеренно по какой-то причине.

Ответ 3

Свойства, помеченные как виртуальные, являются свойствами другого типа entitytype. такие свойства, как string, int и т.д., никогда не отмечены как виртуальные.