C# 为什么实体框架不生成代理?
我将C# 为什么实体框架不生成代理?,c#,entity-framework,C#,Entity Framework,我将DbContext的ProxyCreationEnabled设置为true(实际上是默认值) 据我所知,这使EF能够从数据库中加载代理实体,因此我们对属性所做的任何更改都会被更改跟踪器识别,我们可以这样调用SaveChanges(): using (var db = new MyDbContext()) { var people = db.People.Where(p => p.Status = PersonStatus.New).ToList(); foreach (
DbContext
的ProxyCreationEnabled
设置为true(实际上是默认值)
据我所知,这使EF能够从数据库中加载代理实体,因此我们对属性所做的任何更改都会被更改跟踪器识别,我们可以这样调用SaveChanges()
:
using (var db = new MyDbContext())
{
var people = db.People.Where(p => p.Status = PersonStatus.New).ToList();
foreach (var person in people)
{
person.Name = "Something";
}
db.SaveChanges();
}
问题是:为什么EF不使用特定类的代理,即使ProxyCreationEnabled
为真?该类未密封,因此应该能够使用代理
这是我的示例类:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime RegisterDate { get; set; }
public PersonStatus Status { get; set; }
}
要为属性生成代理,它应该是虚拟的
public class Person
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual DateTime RegisterDate { get; set; }
public virtual PersonStatus Status { get; set; }
}
要获取更改跟踪代理,请
基本规则是你们的班级必须
公开、非抽象或非密封。
您的类还必须实现public
适用于所有人的虚拟getter/setter
持久化的属性。
最后,您必须声明集合
基于关系的导航
属性仅为i集合
。
它们不可能是混凝土
实现或其他接口
源于i收集
(a
与延迟加载的差异
(代理)
看起来是对的。如果只是p.Status=,它应该是两个等号。我会尝试用First()而不是tolist来测试一条记录。@ThomasKoelle谢谢你的帮助,实际上这是一个输入错误,在实际代码中有两个等号。无论是
First()
还是ToList()
返回类而不是代理。“问题是:…”只要查询不是无跟踪(您的不是),您就不依赖于延迟加载,并且autodetectChangeEnabled
是true
,缺少代理应该根本就不是问题。正确。因为EFDbContext
在内部“跟踪”实体实例,包括原始值和当前值。@IvanStoev我不知道这一点。在我的例子中,价值并没有被持久化,但既然你这么说了,我想那是另外一回事了。我正在使用AutoMapper
将一个对象列表(例如PersonViewModel)中的值更新到目标现有实体。我认为这是由于代理,因为AutoMapper
保留了目标实例。我要做更多的测试。无论如何,威震天正确地回答了我的问题,但你指出了一件非常有趣的事情。在将所有属性更改为虚拟后,它成功了。奇怪的是,如果我至少有一个非虚拟财产,EF就不会使用代理。但我有其他非虚拟属性的类,它确实使用代理。这门课有什么问题?