使用LINQ to Entities听起来像是一种查询数据库并获取我可以修改的实际CLR对象,数据绑定等等的好方法。但是,如果我第二次执行相同的查询,我会获得对相同CLR对象或全新集合的引用吗?
我不希望多个查询生成相同实际数据的不断增长的副本数量。这里的问题是我可以改变一个实体的内容并将其保存回数据库,但该实体的另一个实例仍然存在于其他地方并持有旧数据。
答案 0 :(得分:1)
在同一个DataContext中,我的理解是你总是得到相同的对象 - 对于返回完整对象而不是投影的查询。
然而,不同的DataContexts会获取不同的对象 - 因此存在查看过时数据的风险,是的。
答案 1 :(得分:1)
在同一个DataContext中,如果查询它,将获得相同的对象(DataContext为此维护内部缓存)。
请注意,您处理的对象很可能是可变的,因此您可以获得另一个(并发访问)而不是一个问题(数据复制)。
根据业务案例,在提交时让第二个具有陈旧数据的事务失败可能是可以的。
另外,想象一下旧的IDataReader / DataSet场景。两个查询将返回两个不同的读取器,它们将填充不同的数据集。因此,数据重复问题不是特定于ORM的。
答案 2 :(得分:0)
[糟糕;请注意,此回复适用于Linq-to-SQL,而不适用于实体框架。]
我把它留在这里(而不是删除),因为它部分是主题,可能有用。
除了其他回复之外,请注意数据上下文还能够避免仅通过“主键”查询进行往返 - 它将首先检查缓存。
不幸的是,它在3.5中被 completely 分解,并且在3.5SP1中仍为half-broken,但它适用于某些查询。如果您获得单个对象,这可以节省大量时间。
基本上,你需要使用IIRC:
// uses object identity cache (IIRC)
var obj = ctx.Single(x=>x.Id == id);
但不是:
// causes round-trip (IIRC)
var obj = ctx.Where(x=>x.Id == id).Single();