【问题标题】:LINQ to SQL not getting correct dataLINQ to SQL 没有得到正确的数据
【发布时间】:2017-01-10 12:54:13
【问题描述】:

使用 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 或返回列表都没有关系。我无法将其返回到 List,因为我需要整个数据集。

【问题讨论】:

  • 感谢大家的回答。这是一个缓存问题。不知道它存在,但现在我知道了。

标签: c# sql linq


【解决方案1】:

【讨论】:

  • 优秀。谢谢你。这是一本很好的阅读材料,帮助我找出了问题……它正在缓存它,现在我知道如何解决这个问题了。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如果您只需要当前数据,请使用 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 不要跟踪查询的结果。这意味着实体框架不会对查询返回的实体执行额外的处理或存储。但是,这也意味着您无法更新这些实体而不将它们重新附加到跟踪图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 2010-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多