我是Entity Framework的新手。在我的应用程序中,我首先创建了一个实体并将其保存在数据库中。接下来,我对内存中的实体进行了一些更改,但在将当前更改保存到数据库之前,我想将这些值与之前在数据库中保存的值进行比较。
当我尝试从数据库加载实体时,EF依次返回当前在内存中的实体。
我有兴趣知道,如何从数据库中获取实体并将其与当前内存中修改的实体分开?
示例代码
// new entity being created
Person p1 = GetPersonEntity();
p1.Age = 20;
Guid p1Id = _personRepository.AddOrUpdate(p1);
// An update but before saving I want to compare the new age with what was saved previously
p1.Age = 25;
Guid tempId = _personRepository.AddOrUpdate(p1);
// For comparison when I try to fetch entity from database,
// I am getting the current in memory modified entity
_personRepository.FindBy(x => x.Id == p1Id).FirstOrDefault(); // doesn't return values from database
由于
答案 0 :(得分:1)
如果对象仍然连接到上下文(您尚未处理上下文),则无需从数据库加载对象。
结帐ObjectStateManager.GetObjectStateEntry。返回的对象是ObjectStateEntry。该对象包含OriginalValues
和CurrentValues
属性。
DbContext维护对象最初加载时的状态。这是EF用于确定在您调用context.SaveChanges()
时是否需要写入数据库的内容。您可以只访问已更改的属性,如果这是您正在寻找的属性。这些可以在GetModifiedProperties()
上的ObjectStateEntry
方法中找到。
答案 1 :(得分:0)
您可以使用AsNoTracking()
来返回禁用跟踪的查询...
return (from a in context.Animals.AsNoTracking()
select a);