实体框架表和sql表没有相同的数据?

时间:2015-01-29 14:01:42

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

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

我在我的模型中添加了3个表,我认为它的作用只是Mapp与相应实体的表,每次我使用linq到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;
    }

4 个答案:

答案 0 :(得分:1)

您可以轻松使用从ObjectContext派生的ur连接类,而不是使用sql server命令。我将该派生类编写为ObjectContext。输入数据然后调用例如

                  context.SaveChanges();

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

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

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

答案 1 :(得分:0)

来自@AkashaKava

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

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

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

datamodel.Compliances.Where(c =&gt; c.School.DistrictId == districtId).ToList()

Entity Framework Caching Issue

。    。    

来自@Morteza

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

仔细回答:https://stackoverflow.com/a/3653392/1863179

答案 2 :(得分:0)

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

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

EF4 and Caching...

上也有更详细的提及

答案 3 :(得分:0)

实体框架(此处的EF)DbContext不是共享实例。你创建的每一个都拥有它的'&#39;在调用SaveChanges之前,内存中的更改并不会写入数据库。

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

您没有提供有关使用情况的大量背景信息,但您可以设置调试点以查看数据是否确实陈旧,或者,如果使用Web应用程序,则可能是缓存生成的视图并重新显示它与实际过时的数据。也许你没有正确地重新绑定数据。

您还应该记住,上下文应该具有相对性短的生命周期。如果您遇到缓存问题,可能会让上下文过长。