CTP5自带的DbContext T4模板没有关联修正,也没有将所有属性标记为虚拟。这是否意味着当与上下文断开连接时不支持ChangeTracking?首先,即使通过动态代理跟踪,它是否支持在上下文跟踪时进行ChangeTracking?我看到更改跟踪的要求是所有属性都应标记为虚拟。
与EF4 POCO生成器相比,使用DbContext生成器是否会损失任何功能?
非常感谢您的回复。
与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所述。正如你指出的那样,所有映射属性都必须是虚拟的才能使用更改跟踪代理。这对于仅使用延迟加载代理(其中只有导航属性必须是虚拟的)并非必需。
我认为Microsoft应该在T4模板中更改此设置,因为没有更改跟踪代理,速度会慢很多。特别是如果对象上下文中有很多实体。
我已经确认了这一点。在书籍《Programming Entity Framework: DbContext》的第66页中讨论了这个问题。您可以使用类似以下代码来验证对象是否使用更改跟踪代理。
Person p = context.People.Find(123);
bool b = p is IEntityWithChangeTracker;
被标记为虚拟的属性是另一个实体类型的属性。像 string
、int
等属性从不被标记为虚拟。