Entity Framework调用Reload()报错:实体类型myEntities不在上下文模型中
解决Entity Framework重新加载修改后数据的问题
首先得说清楚你为什么会遇到那个错误:你写的dc.Entry(dc).Reload()用法完全错啦!Entry()方法是用来操作单个实体对象的(比如某一条Invoice记录),但你把整个DbContext实例dc传进去了,EF自然会懵——它把myEntities当成了一个实体类型,但这明明是你的上下文类,所以才会抛出那个"The entity type myEntities is not part of the model..."的错误。
下面给你几个靠谱的解决方案,不用纠结Reload()也能拿到最新数据:
方案1:直接重新查询数据(最简单直接)
既然已经成功调用SaveChanges()把修改同步到数据库了,那直接重新从数据库拉取整个Invoice列表就行,完全绕开上下文缓存的问题:
// 重新从数据库获取最新数据 mainSearchedData = dc.Invoice.ToList(); // 更新数据源,WinForms的话可能还要加一句刷新 gvMain.DataSource = mainSearchedData; gvMain.Refresh(); // 如果是WebForms的话用gvMain.DataBind();
这个方法最适合数据量不大的场景,代码简单易懂,不容易出错。
方案2:刷新特定实体(适合只修改了少量数据的情况)
如果你只是修改了某几条特定的Invoice记录,不想重新拉取全部数据,可以用EF的Refresh方法(EF6支持,Core的话需要用其他方式):
// 假设你修改的实体是modifiedInvoice dc.Refresh(System.Data.Entity.Core.Objects.RefreshMode.StoreWins, modifiedInvoice); // 之后再更新数据源 mainSearchedData = dc.Invoice.ToList(); gvMain.DataSource = mainSearchedData;
StoreWins的意思是"以数据库中的值为准",直接用数据库的最新数据覆盖上下文缓存里的旧值。
方案3:新建DbContext实例(彻底避开缓存问题)
EF的DbContext本身会缓存已经查询过的实体,有时候旧上下文的缓存不会自动更新,这时候新建一个上下文实例再查询,就能确保拿到数据库的最新状态:
using (var newDc = new myEntities()) { mainSearchedData = newDc.Invoice.ToList(); gvMain.DataSource = mainSearchedData; }
这个方法适合你需要绝对确保拿到最新数据的场景,缺点是会多创建一个上下文实例,但对于大多数业务场景来说完全没问题。
内容的提问来源于stack exchange,提问作者adam sranko
相关产品推荐
相关产品推荐

