EntityFramework CTP5 DbContext T4模板“虚拟”关键字

时间:2011-02-11 02:31:53

标签: entity-framework entity-framework-ctp5

CTP5附带的DbContext T4模板没有关联修正,并且并非所有属性都标记为虚拟。这是否意味着它与上下文断开连接时不支持ChangeTracking?首先,它是否支持ChangeTracking,即使在被Context(通过动态代理)跟踪时也是如此?我发现变更跟踪的要求是所有属性都应标记为虚拟。

与EF4 POCO生成器相比,我们是否正在使用DbContext生成器丢失任何功能?

非常感谢任何回应。

3 个答案:

答案 0 :(得分: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.
    }

答案 1 :(得分:1)

我认为使用DbContext Generator生成的类只会使用“延迟加载代理”而不是“更改跟踪代理”(请注意有两种类型的代理),如http://blogs.msdn.com/b/adonet/archive/2009/12/22/poco-proxies-part-1.aspx所述。正如您所指出的,所有映射的属性都必须是虚拟的,才能使更改跟踪代理工作。只是延迟加载代理(其中只有导航属性必须是虚拟的)才需要这样做。

我认为微软应该在T4模板中更改这一点,因为没有更改跟踪代理,它会慢得多。特别是如果对象上下文中有很多实体。

我能够证实这一点。在“编程实体框架:DbContext”一书中,第66页讨论了这一点。您可以使用类似于以下内容的代码来验证对象是否正在使用更改跟踪代理。

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

我很惊讶T4模板默认情况下不会将所有属性设为虚拟。这似乎是一种奇怪的疏忽,除非有理由因为某种原因故意这样做。

答案 2 :(得分:0)

标记为虚拟的属性是另一个实体类型的属性。 stringint等属性永远不会标记为虚拟。