首页 > 后端开发 > C++ > ASP.NET MVC:如何由于重复的主密钥而解决'附加实体失败”错误?

ASP.NET MVC:如何由于重复的主密钥而解决'附加实体失败”错误?

Linda Hamilton
发布: 2025-01-30 07:56:09
原创
656 人浏览过

ASP.NET MVC: How to Solve

解决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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板