EntityFramework CTP5 DbContext T4 Шаблон "виртуальное" ключевое слово - PullRequest
22 голосов
/ 11 февраля 2011

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

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

Любой ответ с благодарностью.

Ответы [ 3 ]

1 голос
/ 21 октября 2011

Это все о нетерпеливой и ленивой загрузке.Посмотрите на это

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.
    }
1 голос
/ 30 апреля 2012

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

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

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

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

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

0 голосов
/ 16 июля 2011

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

...