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
,缺少代理应该根本就不是问题。正确。因为EF
DbContext
在内部“跟踪”实体实例,包括原始值和当前值。@IvanStoev我不知道这一点。在我的例子中,价值并没有被持久化,但既然你这么说了,我想那是另外一回事了。我正在使用
AutoMapper
将一个对象列表(例如PersonViewModel)中的值更新到目标现有实体。我认为这是由于代理,因为
AutoMapper
保留了目标实例。我要做更多的测试。无论如何,威震天正确地回答了我的问题,但你指出了一件非常有趣的事情。在将所有属性更改为虚拟后,它成功了。奇怪的是,如果我至少有一个非虚拟财产,EF就不会使用代理。但我有其他非虚拟属性的类,它确实使用代理。这门课有什么问题?