我是实体框架的新手,我无法在线找到我的问题的答案,所以我决定在这里发布我的问题。
我在我的模型中添加了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;
}
答案 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时,默认情况下,每个上下文仅加载一个实体。第一个查询创建实体实例并在内部存储它。任何需要具有相同键的实体的后续查询都会返回此存储的实例。如果数据存储中的值发生更改,您仍会收到包含初始查询值的实体
答案 2 :(得分:0)
实体框架保存了每个DBContext实例缓存的先前结果(对于ObjectContext也可能是相同的),例如,这意味着如果您在同一个DBContext范围内运行相同的linq to sql
查询,则可能会获得缓存结果;虽然SQL按linq to sql
查询发送到数据库服务器,但DBContext
结果可能不会重新更新。
确保在重新查询数据库之前重新实例化DBContext。
上也有更详细的提及答案 3 :(得分:0)
实体框架(此处的EF)DbContext
不是共享实例。你创建的每一个都拥有它的'&#39;在调用SaveChanges
之前,内存中的更改并不会写入数据库。
由于您每次都在创建新的上下文,因此不应该存储在上下文缓存中的任何内容。 EF会将检索到的记录存储在缓存中以便更快地访问
您没有提供有关使用情况的大量背景信息,但您可以设置调试点以查看数据是否确实陈旧,或者,如果使用Web应用程序,则可能是缓存生成的视图并重新显示它与实际过时的数据。也许你没有正确地重新绑定数据。
您还应该记住,上下文应该具有相对性短的生命周期。如果您遇到缓存问题,可能会让上下文过长。