EF - 检索可以在不影响源数据/查询结果的情况下修改的对象

时间:2014-11-25 04:32:23

标签: c# entity-framework

我有一个包含许多默认属性的db表(例如)。我想查询数据库并返回其中一个属性,然后能够在不修改源的情况下对返回的对象进行更改。

基本上,我希望能够在检索defaultAttribute后对其进行更改,而不会影响_context.Attributes中的值。

DefaultAttribute defaultAttribute = new DefaultAttribute();

defaultAttribute = _context.Attributes
    .Where(u => u.Color == color && u.Size == _size)
    .Select(u => u).First();

返回:

defaultAttribute.Color = "Black"
defaultAttribute.Size = "Small"

修改对象:

defaultAttribute.Color = "none";
defaultAttribute.Size = "none";

再次提交查询:

defaultAttribute = _context.Attributes
    .Where(u => u.Color == color && u.Size == _size)
    .Select(u => u).First();

返回:

 defaultAttribute.Color = "none"
 defaultAttribute.Size = "none"

但我需要它来返回未修改的值:

 defaultAttribute.Color = "Black"
 defaultAttribute.Size = "Small"

我不知道我是否在解释这个问题。上面的代码写在我的头顶,以说明我遇到的问题。

如何创建DefaultAttribute对象,从db中检索值并能够更改DefaultAttribute而不影响后续调用中从db返回的值?

2 个答案:

答案 0 :(得分:1)

您可以使用.AsNoTracking()从实体上下文中分离对象。

defaultAttribute = _context.Attributes
.Where(u => u.Color == color && u.Size == _size)
.Select(u => u).AsNoTracking().First();

此外,您可以在where子句之前使用它,直接在table对象本身上使用它:

defaultAttribute = _context.Attributes
.AsNoTracking()
.Where(u => u.Color == color && u.Size == _size)
.Select(u => u).First();

您需要包含System.Data.Entity命名空间,并且在Visual Basic和C#中,您可以根据[MSDN] {IQ <3}}上的任何IQueryable类型的对象将此方法作为实例方法调用。 p>

答案 1 :(得分:0)

正如David L所提到的,您可以使用AsNoTracking()来解决问题。

以下是另一种方法:

defaultAttribute = _context.Set<Attribute>().AsNoTracking()
                  .Where(u => u.Color == color && u.Size == _size)
                  .Select(u => u).First();

这可以解决您遇到的其他问题: .. no extension method 'AsNoTracking' accepting a first argument ..

您可能希望包含using System.Data.Entity;,如果您还没有。