为什么Entity Framework不生成代理?

时间:2018-01-04 12:56:31

标签: 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 (var person in people)
    {
        person.Name = "Something";
    }
    db.SaveChanges();
}

问题是:即使ProxyCreationEnabled为真,为什么EF不会将代理用于特定的类?该类没有密封,因此它应该能够使用代理。

这是我的示例课程:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime RegisterDate { get; set; }
    public PersonStatus Status { get; set; }
}

1 个答案:

答案 0 :(得分:2)

要为属性生成代理,它应该是虚拟的

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; }
}
  

要获取更改跟踪代理,请执行此操作   基本规则是你的班级必须是   公开的,非抽象的或非密封的。   你的班级也必须实施公开   所有人的虚拟getter / setter   持久化的属性。   最后,您必须声明收集   基于关系的导航   属性仅为ICollection<T>。   它们不可能是具体的   实现或其他接口   源自ICollection<T>(a   与递延加载的差异   代理)