【问题标题】:EntityFramework CTP5 DbContext T4 Template "virtual" keywordEntityFramework CTP5 DbContext T4 模板“虚拟”关键字
【发布时间】:2011-02-11 02:31:53
【问题描述】:

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

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

非常感谢任何回应。

【问题讨论】:

  • 这个问题部分解决了这里的问题:stackoverflow.com/questions/5340990/…
  • 我的 2cents。 DbContext API(Code First t4 模板使用)只是 ObjectContext(POCO t4 模板使用)的包装器。因此,您可能不应该放弃任何功能,但在当前时间点(如果您在时间限制下工作),我建议您使用 ObjectContext ,因为您会更快地获得帮助,并且它有很好的文档记录。我认为所有属性在两个 t4 模板中都标记为虚拟,用于生成动态代理。很高兴知道事实并非如此
  • 嗨,不知道你是否还在使用这个,但我认为你应该尝试 EF 4.1。动态代理是围绕由 DbContext 生成器生成的 POCO 类自动生成的。例如,更改跟踪不再需要虚拟关键字。如果你需要 ObjectContext,你可以从 de DbContext 访问它(在一些转换操作之后),所以你不会失去任何功能

标签: entity-framework entity-framework-ctp5


【解决方案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 模板中更改这一点,因为如果没有更改跟踪代理,它会慢很多。特别是如果您在对象上下文中有很多实体。

    我能够确认这一点。在 Programming Entity Framework: DbContext 一书中,第 66 页谈到了这一点。您可以使用类似于以下的代码来验证对象是否正在使用更改跟踪代理。

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

    我很惊讶 T4 模板在默认情况下并未将所有属性设为虚拟。这似乎是一个奇怪的疏忽,除非他们出于某种原因故意这样做。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-01
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        • 2011-07-15
        • 1970-01-01
        相关资源
        最近更新 更多