首页 >后端开发 >C++ >如何解决ASP.NET MVC中的'由于重复的主要钥匙值的重复主键值失败”的'附加实体失败”?

如何解决ASP.NET MVC中的'由于重复的主要钥匙值的重复主键值失败”的'附加实体失败”?

Patricia Arquette
Patricia Arquette原创
2025-01-30 08:16:10990浏览

How to Resolve

在将实体附加在ASP.NET MVC

中时,将重复的主键错误进行故障排除。 在ASP.NET MVC应用程序中,由于重复的主要密钥约束违规,尝试附加实体可能会失败。 这通常表现为一个错误消息,表明具有相同主键的实体已经存在。 本文详细介绍了一个共同的原因及其解决方案。 使用

将实体的状态更新为

时,问题经常出现。 调查通常表明,在状态更新之前,一个单独的功能负责授权或数据检索的单独函数,请预先加载相同的实体

>。 此预加载过程可能会导致实体变得分离,从而导致后续操作失败,因为该框架认为它正在尝试添加重复。

>解决方案涉及防止预加载函数跟踪加载实体。 这可以通过在实体框架查询中利用EntityState.Modified的方法来实现。db.Entry(entity).State = EntityState.Modified> 考虑有问题的函数的以下示例:Attach>

>此功能加载实体,使其可通过上下文跟踪。 要纠正这一点,请修改函数以使用AsNoTracking()

>

canUserAccessA使用

>确保上下文不跟踪已加载的实体,从而防止与后续
<code class="language-csharp">// Problematic function - loads and tracks the entity
private bool canUserAccessA(int aID)
{
    int userID = WebSecurity.GetUserId(User.Identity.Name);
    int aFound = db.Model.Where(x => x.aID == aID && x.UserID == userID).Count(); // Tracks the entity

    return (aFound > 0);
}</code>
>或

操作发生冲突。 请注意,在与AsNoTracking()一起使用

的同时似乎更简单,但根据数据库和上下文配置,它可能无效。 提供的查询提供了一种更强大的方法。
<code class="language-csharp">// Corrected function - loads the entity without tracking
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);
}</code>

此修改有效地解决了重复的主要关键问题,为ASP.NET MVC开发中的类似问题提供了可靠的解决方案。

以上是如何解决ASP.NET MVC中的'由于重复的主要钥匙值的重复主键值失败”的'附加实体失败”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn