CTP5 附带的 DbContext T4 模板没有关联修复,并且并非所有属性都标记为虚拟。这是否意味着它在与上下文断开连接时不支持 ChangeTracking?首先,即使被 Context 跟踪(通过动态代理),它是否支持 ChangeTracking?我看到更改跟踪的要求是所有属性都应标记为虚拟。
与 EF4 POCO 生成器相比,我们是否失去了使用 DbContext 生成器的任何功能?
非常感谢任何回应。
CTP5 附带的 DbContext T4 模板没有关联修复,并且并非所有属性都标记为虚拟。这是否意味着它在与上下文断开连接时不支持 ChangeTracking?首先,即使被 Context 跟踪(通过动态代理),它是否支持 ChangeTracking?我看到更改跟踪的要求是所有属性都应标记为虚拟。
与 EF4 POCO 生成器相比,我们是否失去了使用 DbContext 生成器的任何功能?
非常感谢任何回应。
这都是关于急切和延迟加载的。看看这个
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.
}
我认为使用 DbContext 生成器生成的类将仅使用“延迟加载代理”而不是“更改跟踪代理”(注意有两种类型的代理),如http://blogs.msdn.com/b所述/adonet/archive/2009/12/22/poco-proxies-part-1.aspx。正如您所指出的,所有映射的属性都必须是虚拟的,更改跟踪代理才能工作。对于延迟加载代理(只有导航属性必须是虚拟的),这不是必需的。
我认为微软应该在 T4 模板中更改这一点,因为没有更改跟踪代理,它会慢很多。特别是如果您在对象上下文中有很多实体。
我能够证实这一点。在 Programming Entity Framework: DbContext 一书中,第 66 页谈到了这一点。您可以使用类似于以下的代码来验证对象是否正在使用更改跟踪代理。
Person p = context.People.Find(123);
bool b = p is IEntityWithChangeTracker;
我很惊讶 T4 模板默认情况下并未将所有属性设为虚拟。这似乎是一个奇怪的疏忽,除非他们出于某种原因故意这样做。
标记为虚拟的属性是另一个实体类型的属性。string
等属性int
永远不会标记为虚拟。