实体框架和维护实体的两个实例

时间:2014-04-13 20:07:01

标签: .net entity-framework

我是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

由于

2 个答案:

答案 0 :(得分:1)

如果对象仍然连接到上下文(您尚未处理上下文),则无需从数据库加载对象。

结帐ObjectStateManager.GetObjectStateEntry。返回的对象是ObjectStateEntry。该对象包含OriginalValuesCurrentValues属性。

DbContext维护对象最初加载时的状态。这是EF用于确定在您调用context.SaveChanges()时是否需要写入数据库的内容。您可以只访问已更改的属性,如果这是您正在寻找的属性。这些可以在GetModifiedProperties()上的ObjectStateEntry方法中找到。

答案 1 :(得分:0)

您可以使用AsNoTracking()来返回禁用跟踪的查询...

return (from a in context.Animals.AsNoTracking()
        select a);