解决ASP.NET MVC中因主键冲突导致的“附加实体”错误
在ASP.NET MVC中,编辑模型并将其状态更新为“已修改”时,可能会遇到错误:“附加类型为'MODELNAME'的实体失败,因为另一个相同类型的实体已具有相同的主键值”。此错误发生在要更新的实体已存在于上下文的跟踪注册表中时。
在给定的场景中,错误在以下行中抛出:
<code class="language-csharp">db.Entry(aViewModel.a).State = EntityState.Modified;</code>
错误分析:
问题源于控制器的Edit (GET)操作,该操作加载要编辑的实体。在此操作中,canUserAccessA方法尝试通过独立加载实体来验证用户访问权限。此后续加载将实体置于分离状态。
解决方案:
为了解决冲突,必须修改canUserAccessA方法,以确保在查询上下文时不跟踪实体。这可以通过调用.AsNoTracking()
方法来实现,如下所示:
<code class="language-csharp">private bool canUserAccessA(int aID) { int userID = WebSecurity.GetUserId(User.Identity.Name); int aFound = db.Model.AsNoTracking().Where(x => x.aID == aID && x.UserID==userID).Count(); return (aFound > 0); //如果 aFound > 0,则返回 true,否则返回 false。 }</code>
说明:
通过使用.AsNoTracking()
,实体在加载时不会被上下文跟踪。这可以防止后续更新与分离实体的状态冲突。
结论:
错误“附加类型为'MODELNAME'的实体失败...”可能发生在要更新的实体已被上下文跟踪时。为了解决此冲突,必须确保任何独立加载实体的操作都禁用跟踪,如修改后的canUserAccessA方法所示。
以上是ASP.NET MVC:如何由于重复的主密钥而解决'附加实体失败”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!