我有一个包含许多默认属性的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返回的值?
答案 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;
,如果您还没有。