如何修复“ObjectContext 实例已被处置”

     2023-02-16     143

关键词:

【中文标题】如何修复“ObjectContext 实例已被处置”【英文标题】:How can I fix "The ObjectContext instance has been disposed " 【发布时间】:2020-06-10 01:12:53 【问题描述】:

我开发了一个带有实体框架的应用程序。我明白了

ObjectContext 实例已被释放,不能再使用 用于需要连接的操作。

有时会出错。

我在互联网上做了一些研究,但我无法弄清楚。如果您能提供帮助,我将不胜感激

家庭控制器:

public ActionResult Index()

    return View(noteManager.ListQueryable().Where(x => x.IsDraft == false && x.IsApproved == true).OrderByDescending(x => x.ModifiedOn).Take(10).ToList());

我的笔记实体:

public class Note : MyEntitesBase
       
    public string Tittle  get; set; 
    public string Text  get; set; 
    public bool IsDraft  get; set; 
    public int LikeCount  get; set; 
    public int CategoryID  get; set; 

    public virtual EvernoteUser Owner  get; set;  
    public virtual List<Comment> Comments  get; set;  
    public virtual Category Category  get; set;  
    public virtual List<Liked> Likes  get; set;  

    public Note()
    
        Comments = new List<Comment>();
        Likes = new List<Liked>();
    


我的评论实体:

public class Comment : MyEntitesBase

    public string Text  get; set; 
    public bool CommentStatus  get; set; 

    public virtual Note Note  get; set; 
    public virtual EvernoteUser Owner  get; set;  

我的数据库上下文:

public class DatabaseContext :DbContext 

   public DbSet<EvernoteUser> EvernoteUsers  get; set; 
   public DbSet<Note> Notes  get; set; 
   public DbSet<Comment> Comments  get; set; 
   public DbSet<Category> Categories  get; set; 
   public DbSet<Liked> Likes  get; set; 

   public DatabaseContext()
              
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<DatabaseContext,Configuration>()); 

    


【问题讨论】:

如何初始化noteManager?而noteManagerDBContext是什么关系? 【参考方案1】:

这个问题通常源于序列化程序,它会触及被序列化实体上的所有属性以发送到视图。如果与实体关联的 DbContext 被释放,则序列化程序将在尝试发出查询以加载相关详细信息时遇到此问题。

如果noteManager.ListQueryable() 返回IQueryable&lt;Note&gt;,快速解决方法是:

return View(noteManager.ListQueryable()
    .Include(x => x.Owner)
    .Include(x => x.Comments)
    .Include(x => x.Category)
    .Include(x => x.Likes)
    .Where(x => x.IsDraft == false && x.IsApproved == true)
    .OrderByDescending(x => x.ModifiedOn)
    .Take(10).ToList());

这种渴望加载相关实体以及注释。急切加载和延迟加载之间的区别在于,对于急切加载,EF 将生成 SQL 以连接所有关联的表,然后检索最多 10 个选定行的相关行。使用延迟加载,您可能有 10 个注释行,例如 ID 为 1-10,但随着每个属性被触摸,EF 将生成如下查询:

SELECT * FROM Owners WHERE OwnerID = 22 -- 注释 1 上的所有者 ID

SELECT * FROM Comments WHERE NoteId = 1

SELECT * FROM Categories WHERE CategoryId = 4 注释 1 上的类别 ID

SELECT * FROM Likes WHERE NoteId = 1

然后再重复 9 次,每返回一个音符行一次。这是 EF 和 DB 在实体的代理持有对 DbContext 的弱引用时需要协商的大量查询。如果请求在序列化程序完成实体之前处理 DbContext,则您将收到一个正在处理的异常。

但是,即使使用即时加载,如果任何相关实体本身都有子实体,这也可能是一个兔子洞。加载视图可能不需要的所有相关数据也会对性能/资源产生影响。

更好的长期解决方案是定义可序列化的 ViewModel 来表示您的视图实际需要显示的数据结构,然后利用 Select 或 Automapper 的 ProjectTo 用实体结构中的数据填充该视图模型。这消除了急切加载数据的需要,只需来自结构的Select,EF 就会计算出 SQL。它还消除了序列化程序中延迟加载命中的风险,前提是您来自实体而不是实体本身的 Select 字段。这也可以大大减少服务器和客户端在请求时存储数据所需的内存量以及数据传输大小。

将视图模型传递给视图意味着将相同或不同的视图模型传回服务器,而不是尝试传回实体、附加和保存...与加载再次数据并复制值。但是,这样做更安全,因为您不会冒陈旧、不完整或可能被篡改的数据覆盖真实数据的风险。在执行更新时,您应该始终重新加载实体,以验证并检查行在发送到客户端后是否未被修改。不信任来自 Web 客户端的任何内容。将字段复制到新加载的实体也意味着更有效的 UPDATE 语句,因为 Attaching + EntityState.Modified 或使用 DbContext.Update() 导致更新语句更新 all 字段,而不是复制,只有值被更改的将被添加到 UPDATE 语句中。

【讨论】:

如何修复 npm 审计修复问题?

】如何修复npm审计修复问题?【英文标题】:Howtofixnpmauditfixissues?【发布时间】:2019-01-1222:29:44【问题描述】:┌───────────────┬──────────────────────────────────... 查看详情

如何禁用增量修复?

】如何禁用增量修复?【英文标题】:HowdoIdisableincrementalrepair?【发布时间】:2017-07-1110:26:24【问题描述】:我有一个集群,我正在考虑启用增量修复。如果出现任何问题,我想在每个节点上禁用增量修复。我该怎么做?【问题... 查看详情

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)

】如何修复这些漏洞?(npmauditfix无法修复这些漏洞)【英文标题】:Howtofixthesevulnerabilities?(npmauditfixfailstofixthesevulnerabilities)【发布时间】:2020-02-1520:35:23【问题描述】:我的项目有6个高度严重的漏洞,我不知道如何修复它们。... 查看详情

分享网站漏洞检测与如何修复网站逻辑漏洞

分享网站漏洞检测与如何修复网站逻辑漏洞分类专栏:网站安全网站被篡改网站被黑如何防止网站被黑如何防止网站被侵入如何防止网站被挂马网站安全服务网站安全防护服务网站安全维护网站安全问题ecshop漏洞修复MetInfo漏洞... 查看详情

如何使用 scrollView 修复背景图像和使用 edittext 修复 textviews

】如何使用scrollView修复背景图像和使用edittext修复textviews【英文标题】:HowtofixbackgroundimagewithscrollViewandtextviewswithedittext【发布时间】:2016-11-1006:10:34【问题描述】:windowSoftInputMode出现时如何用滚动视图修复背景图像。我使用了w... 查看详情

如何修复高度:在 Firefox 中使用 flexbox 自动修复? [复制]

】如何修复高度:在Firefox中使用flexbox自动修复?[复制]【英文标题】:Howtofixheight:autowithflexboxinFirefox?[duplicate]【发布时间】:2017-12-1017:29:22【问题描述】:我对flexbox和height:autoinFirefox有疑问:.portfoliowidth:100%;position:relative;overflow... 查看详情

如何修复“缺少'使用严格'声明”?

】如何修复“缺少\\\'使用严格\\\'声明”?【英文标题】:HowcanIfix"Missing\'usestrict\'statement"?如何修复“缺少\'使用严格\'声明”?【发布时间】:2016-02-0917:46:33【问题描述】:$(document).ready(function()\'usestrict\';$(\'#c2\').hide(\'sl... 查看详情

给定修复的提交哈希,我怎么能弄清楚代码是如何修复的? [复制]

】给定修复的提交哈希,我怎么能弄清楚代码是如何修复的?[复制]【英文标题】:Giventhecommithashofafix,howcouldIgetthefigureouthowexactlythecodeisfixed?[duplicate]【发布时间】:2018-08-2510:38:00【问题描述】:假设我有一个修复错误的提交哈希... 查看详情

修复 WiX 捆绑包时如何防止 .NET 修复?

】修复WiX捆绑包时如何防止.NET修复?【英文标题】:HowdoIprevent.NETfromrepairingwhenrepairingaWiXbundle?【发布时间】:2013-12-0419:01:00【问题描述】:我有一个使用burn创建的包安装程序,第一步安装.NET:<Chain><!--Applicationsdependon.NET4... 查看详情

节点:如何修复路由?

】节点:如何修复路由?【英文标题】:Node:Howtofixrouting?【发布时间】:2017-11-1006:51:03【问题描述】:我需要使用路由器来集成应用程序。我使用app.use(\'/chat\'来定义应用程序。应用程序单独工作,但不能与路由文件一起工作。... 查看详情

如何修复 c6385?

】如何修复c6385?【英文标题】:HowcanIfixc6385?【发布时间】:2022-01-0719:48:52【问题描述】://Takelastelementfromdeckandaddtodealer\'shand//Updatecurrentelementsafter//Ensurethedeckstillhascardsif(deck.currentElements==0)getNewDeck(deck);shuffleD 查看详情

如何修复导航菜单

】如何修复导航菜单【英文标题】:Howtofixnavmenu【发布时间】:2020-09-2503:42:19【问题描述】:如何修复我的菜单,当网络稳定菜单仅在移动设备上,但菜单不显示或隐藏时<divclass="container"><aclass="logo"href="<?phpechosite_url();?... 查看详情

如何修复跨站点脚本(XSS)?我们可以使用 .htaccess 修复吗

】如何修复跨站点脚本(XSS)?我们可以使用.htaccess修复吗【英文标题】:HowtofixCrossSiteScripting(XSS)?canwefixusing.htaccess【发布时间】:2018-05-2509:58:10【问题描述】:我无法修复我们网站上的跨站脚本(XSS)。我正在清理输入。部分代... 查看详情

如何修复可能的未处理承诺拒绝(id:0)?以及如何修复无法读取未定义的属性“导航”?

】如何修复可能的未处理承诺拒绝(id:0)?以及如何修复无法读取未定义的属性“导航”?【英文标题】:HowtofixPossibleUnhandledPromiseRejection(id:0)?andHowtofixCannotreadproperty\'navigate\'ofundefined?【发布时间】:2019-08-1105:17:07【问题描述... 查看详情

如何轻松修复 Checkstyle 错误?

】如何轻松修复Checkstyle错误?【英文标题】:HowcanIeasilyfixCheckstyleerrors?【发布时间】:2012-01-1414:18:05【问题描述】:有没有办法让IDE自动修复Checkstyle错误而无需手动修复每个错误?【问题讨论】:【参考方案1】:有一种方法可... 查看详情

如何修复 MSSQLLocalDB?

】如何修复MSSQLLocalDB?【英文标题】:HowtofixMSSQLLocalDB?【发布时间】:2015-11-0905:26:20【问题描述】:在我的机器上MSSQLLocalDB已损坏:PSC:\\WINDOWS\\system32>sqllocaldbiMSSQLLocalDBProjectsProjectsV12v11.0PSC:\\WINDOWS\\system32>sqllocaldbimssqlloc 查看详情

如何使用 Objective-C 修复 UIViewController 中的页脚?

】如何使用Objective-C修复UIViewController中的页脚?【英文标题】:HowtofixthefooterinUIViewControllerusingObjective-C?【发布时间】:2017-05-0609:16:51【问题描述】:我对iOS编程非常陌生。我必须修复UIViewController中的页脚。我知道如何修复UITable... 查看详情

如何修复 Firebase 通知

】如何修复Firebase通知【英文标题】:HowtofixFirebaseNotifications【发布时间】:2019-04-0308:08:44【问题描述】:我已经正确实现了Firebase通知,一些设备没有收到vivo通知,在后台运行时对焦如何解决该问题publicvoidgetNotification(Stringicon,S... 查看详情