我有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; }
}
答案 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 与递延加载的差异 代理)