LINQ to SQL无法获取正确的数据

时间:2011-11-29 14:50:52

标签: c# sql linq

使用Studio 2008,C#,SQL Server 2005,Winforms。我看过这个网站,找不到相同的情况......

我从LINQ到SQL连接填充了data1窗口。我点击一个按钮打开data2窗口并在那里编辑数据。 当我关闭data2窗口时,我需要刷新data1窗口中的数据。 所以我通过LINQ调用SQL Server。我没有收到我刚刚从data2窗口保存的新数据。我收到的旧数据已经存在了。 有什么想法吗?我确认数据已保存在SQL数据库中,并且存在。

现在,如果我关闭data1窗口并重新打开它,那么正确的数据就在那里。但是,当我关闭data2窗口后立即重新查询数据库时,为什么data1窗口中的数据没有更新?

代码:

IEnumerable<tblConstructionRevision> newRev1 = (from y in DDBML.tblConstructionRevisions orderby y.RevDate descending, y.RevNo descending where y.DrawID == drawID select y);

如果我收回FirstOrDefault或列表并不重要。我无法将其返回到列表&lt;&gt;因为我需要整个数据集。

4 个答案:

答案 0 :(得分:4)

答案 1 :(得分:4)

您需要使用Refresh method of your data context使缓存无效。

答案 2 :(得分:2)

听起来你的表格就是DDBML。我认为只要上下文打开,它就会缓存被跟踪的实体。你应该使用datacontext然后处理它,并在需要时打开一个新的。有关缓存的更多信息,请参阅此处:http://blogs.msdn.com/b/dinesh.kulkarni/archive/2008/07/01/linq-to-sql-tips-9-understanding-datacontext-s-internal-caching.aspx

答案 3 :(得分:0)

如果您只想要当前数据,请使用MergeOption.NoTracking。这意味着它们不会存储在跟踪同一上下文中实体的更新和删除的图形中。如果您正在阅读的数据已在其他上下文,窗口或应用程序中更新,则此方法可确保您读取的数据是最新的。应该注意,禁用对象跟踪也会阻止您向数据库提交更新。因此,在阅读之后,您应该将MergeOption值放入原始值。

colum1  | colum2    | colum3    | table2State
--------+-----------+-----------+--------------
test1   | pizza     | margarita |
test1   | pizza     | cheese    | replaced
test1   | pizza     | hawaii    | replaced
test1   | burger    | salad     |
test2   | pizza     | margarita |
test2   | pizza     | ham       |
test2   | burger    | tomat     | skipped
test2   | burger    | salad     |
test3   | pig       | green     |

或者您可以使用ExecuteStoreQuery()方法,并在参数中指定NoTracking。可以达到同样的效果。

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;

在Entity Framework 4.1中,您可以使用新的AsNoTracking()方法:

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));

var newRev1 = (from y in DDBML.tblConstructionRevisions.AsNoTracking() 
     orderby y.RevDate descending, y.RevNo descending
     where y.DrawID == drawID select y);

<强> What NoTracking Does

实体框架提供了许多性能调优选项,可帮助您优化应用程序的性能。其中一个调整选项是.AsNoTracking()。此优化允许您告知实体框架不跟踪查询的结果。这意味着实体框架不会执行查询返回的实体的其他处理或存储。但是,这也意味着您无法更新这些实体,而无需将其重新连接到跟踪图。