如果您只需要当前数据,请使用 MergeOption.NoTracking。这意味着它们不会存储在跟踪同一上下文中实体的更新和删除的图中。如果您正在读取的数据已经在另一个上下文、窗口或应用程序中更新,则此方法可确保您读取的数据是最新的。应该注意的是,禁用对象跟踪也会阻止您向数据库提交更新。所以看完之后,应该把 MergeOption 的值放到原来的里面。
System.Data.Objects.MergeOption mergeOption = DDBML.tblConstructionRevisions.MergeOption;
DDBML.tblConstructionRevisions.MergeOption = System.Data.Objects.MergeOption.NoTracking;
var newRev1 = (from y in DDBML.tblConstructionRevisions
orderby y.RevDate descending, y.RevNo descending
where y.DrawID == drawID select y);
DDBML.tblConstructionRevisions.MergeOption = mergeOption;
或者您可以使用 ExecuteStoreQuery() 方法,并在参数中指定 NoTracking。可以达到同样的效果。
var newRev1=db.ExecuteStoreQuery<tblConstructionRevisions>(
"SELECT * FROM tblConstructionRevisions y WHERE y.DrawID = @ID
order by y.RevDate desc, y.RevNo desc",
"tblConstructionRevision",
System.Data.Objects.MergeOption.NoTracking,
new SqlParameter("@ID", drawID));
在 Entity Framework 4.1 中,您可以使用新的 AsNoTracking() 方法:
var newRev1 = (from y in DDBML.tblConstructionRevisions.AsNoTracking()
orderby y.RevDate descending, y.RevNo descending
where y.DrawID == drawID select y);
或
var newRev1 = (from y in DDBML.tblConstructionRevisions
orderby y.RevDate descending, y.RevNo descending
where y.DrawID == drawID select y).AsNoTracking();
What NoTracking Does
Entity Framework 公开了许多性能调整选项来帮助您优化应用程序的性能。这些调整选项之一是 .AsNoTracking()。此优化允许您告诉 Entity Framework 不要跟踪查询的结果。这意味着实体框架不会对查询返回的实体执行额外的处理或存储。但是,这也意味着您无法更新这些实体而不将它们重新附加到跟踪图。