【问题标题】:Entity framework tables and sql tables does not have the same data?实体框架表和sql表没有相同的数据?
【发布时间】:2015-03-28 18:58:44
【问题描述】:

我是实体框架的新手,我无法在网上找到我的问题的答案,所以我决定在这里发布我的问题。

我在我的模型中添加了 3 个表,我认为它所做的只是将表与相应的实体进行映射,并且每次我使用 linq to sql 时它都会转到数据库并检索我需要的数据,但我认为我错了,因为我更新了一个表(使用 SQL Server),然后我运行了应用程序,我意识到它仍然有旧数据。

所以我的猜测是 edmx 表存储在内存中,除非我告诉他们这样做,否则它们不会更新?我是对的还是我做错了什么?

一些代码:

 public List<Setting> SetGeneralSettings()
    {
      List<Setting> GeneralSettings = null;
        using (var Entity = new Entities())
        {
            //Entity.GeneralSettings_Skills.
            GeneralSettings = (from settings in Entity.Table1
                                             select new Setting
                                            {
                                                Property1 = settings.Property1,
                                                Property11 = settings.Property11,
                                                Property12 = settings.Property12,
                                                Property14 = settings.Property14,
                                                Property15 = settings.Property15,
                                                Property16 = settings.Property16,
                                                Property17 = settings.Property17,
                                                Property18 = settings.Property18,
                                                Property19 = (from o in Entity.Table2
                                                                 where o.IdTable2 == settings.IdTable1
                                                                 select o.valTable2).ToList(),
                                                SkillsList2 = (from s in Entity.Table3
                                                              where s.IdTable3 == settings.IdTable1
                                                              select s.valTable3).ToList()

                                            }).Where(p => p.Project == "Test project").ToList();
        }
            return GeneralSettings;
    }

【问题讨论】:

    标签: c# database entity-framework entity-framework-5


    【解决方案1】:

    您可以轻松地使用派生自 ObjectContext 的连接类,而不是使用 sql server 命令。我将该派生类写为 ObjectContext 。输入数据后再调用例子

                      context.SaveChanges();
    

    如果你想刷新数据,你可以使用

                  using(ObjectContext context1 = new ObjectContext())
                  {
                   exampleBindingSource.DataSource  = context1.Example;
                  }
    

    您可以像这样进行刷新。如果我对你的理解是正确的:)

    【讨论】:

      【解决方案2】:

      来自@AkashaKava

      除非您重新查询上下文,否则 EF 不会加载更改。 EF 查询 db 并将它们加载到对象中,它监视您对对象而不是数据库执行的更改。 EF 不跟踪直接对数据库所做的更改,并且永远不会跟踪。

      您已经加载了一个列表,该列表是您在内存中的缓存。即使调用 Save Changes 也不会刷新。您将不得不再次查询上下文,即创建新列表。

      要查看更改,您必须再次执行以下行,

      datamodel.Compliances.Where(c => c.School.DistrictId == DistrictId).ToList()

      Entity Framework Caching Issue

      。 . .

      来自@Morteza

      当您使用 EF 时,默认情况下每个上下文仅加载每个实体一次。第一个查询创建实体实例并将其存储在内部。任何需要具有相同键的实体的后续查询都会返回此存储的实例。如果数据存储中的值发生更改,您仍然会收到带有初始查询值的实体

      认真回答:https://stackoverflow.com/a/3653392/1863179

      【讨论】:

      • 我正在使用此代码:使用 (var entity = new Entities()) {....},这不是自 Entities: DBContext 以来 DBContext 的新实例吗?
      • 如果没有提交更改,新的 var 实体会在初始化时获取上下文,因为更改适用于该对象的实例并且仅适用于该对象。您需要刷新上下文/追加更改。
      【解决方案3】:

      实体框架保存每个 DBContext 实例缓存的先前结果(对于 ObjectContext 也可能相同),例如,这意味着如果您在同一 DBContext 范围内运行相同的 linq to sql 查询,您可能会得到缓存的结果;尽管每个linq to sql 查询都会将SQL 发送到数据库服务器,但DBContext 结果可能不是最新更新的。

      确保在重新查询数据库之前重新实例化 DBContext。

      EF4 and Caching...上也有更详细的提及

      【讨论】:

      • 我正在使用此代码:使用 (var entity = new Entities()) {....},这不是自 Entities: DBContext 以来 DBContext 的新实例吗?
      • 根据我对您使用 new Entities() 的理解,这似乎是正确的...您可以发布一些代码吗?
      【解决方案4】:

      实体框架(从这里开始的 EF)DbContext 不是共享实例。您创建的每一个都在内存中保存自己的更改,并且在您调用 SaveChanges 之前不会写入数据库。

      由于您每次都在创建一个新的上下文,所以不应该有任何内容存储在上下文的缓存中。 EF 确实将检索到的记录存储在缓存中以便更快地访问

      您没有提供很多关于使用的上下文,但您可以设置调试点以查看数据是否确实过时,或者,如果使用 Web 应用程序,它可能会缓存结果视图并重新显示它与实际过时的数据。也许您没有正确地重新绑定数据。

      您还应该记住,上下文应该有一个相对较短的生命周期。如果遇到缓存问题,可能是因为上下文存在时间过长。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-22
        • 2014-06-12
        • 2015-02-14
        • 1970-01-01
        • 2017-09-26
        • 1970-01-01
        • 1970-01-01
        • 2011-04-29
        相关资源
        最近更新 更多