程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ASP.NET MVC-附加类型为“ MODELNAME”的实体失败,因为相同类型的另一个实体已经具有相同的主键值大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决ASP.NET MVC-附加类型为“ MODELNAME”的实体失败,因为相同类型的另一个实体已经具有相同的主键值?

开发过程中遇到ASP.NET MVC-附加类型为“ MODELNAME”的实体失败,因为相同类型的另一个实体已经具有相同的主键值的问题如何解决?下面主要结合日常开发的经验,给出你关于ASP.NET MVC-附加类型为“ MODELNAME”的实体失败,因为相同类型的另一个实体已经具有相同的主键值的解决方法建议,希望对你解决ASP.NET MVC-附加类型为“ MODELNAME”的实体失败,因为相同类型的另一个实体已经具有相同的主键值有所启发或帮助;

问题解决了!

Attach该方法可能会帮助某人,但在这种情况下将无济于事,因为在将文档加载到Edit GET控制器功能中时已经对其进行了跟踪。附加将引发完全相同的错误。

我在这里遇到的问题是由canUserAccessA()在更新对象a的状态之前加载A实体的函数引起的。这正在破坏被跟踪的实体,并将对象的状态更改为Detached

解决方案是进行修改,canUserAccessA()便不会跟踪正在加载的对象。AsnoTracking()查询上下文时应调用函数。

// User -> Receipt valIDation
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); //if aFound > 0, then return true, else return false.
}

出于某种原因,我无.Find(aID)与之配合使用,AsnoTracking()但这并不重要,因为我可以通过更改查询来实现相同的目的。

希望这会帮助任何有类似问题的人!

解决方法

简而言之,在POST包装模型和将一个条目的状态更改为“已修改”的过程中会引发异常。在更改状态之前,将状态设置为“已分离”,但是调用Attach()确实会引发相同的错误。我正在使用EF6。

请在下面找到我的代码(型号名称已更改,以便于阅读)

模型

// Wrapper classes
        public class AViewModel
        {
            public A a { get; set; }
            public List<B> b { get; set; }
            public C c { get; set; }
        }

控制者

        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new httpStatusCodeResult(httpStatusCode.badrequest);
            }

            if (!canUserAccessA(id.value))
                return new httpStatusCodeResult(httpStatusCode.Forbidden);

            var aViewModel = new AViewModel();
            aViewModel.A = db.As.Find(id);

            if (aViewModel.Receipt == null)
            {
                return httpNotFound();
            }

            aViewModel.b = db.bs.Where(x => x.aID == id.value).ToList();
            aViewModel.Vendor = db.Cs.Where(x => x.cID == aViewModel.a.cID).FirstOrDefault();

            return View(aViewModel);
        }

[httpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(AViewModel aViewModel)
        {
            if (!canUserAccessA(aViewModel.a.aID) || aViewModel.a.UserID != WebSecurity.GetUserId(User.Identity.Name))
                return new httpStatusCodeResult(httpStatusCode.Forbidden);

            if (ModelState.IsValid)
            {
                db.Entry(aViewModel.a).State = EntityState.Modified; //THIS IS WHERE THE ERROR IS BEING THROWN
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(aViewModel);
        }

如上线所示

db.Entry(aViewModel.a).State = EntityState.Modified;

引发异常:

是否有人在我的代码中看到任何错误,还是了解在什么情况下在编辑模型期间会引发此类错误?

大佬总结

以上是大佬教程为你收集整理的ASP.NET MVC-附加类型为“ MODELNAME”的实体失败,因为相同类型的另一个实体已经具有相同的主键值全部内容,希望文章能够帮你解决ASP.NET MVC-附加类型为“ MODELNAME”的实体失败,因为相同类型的另一个实体已经具有相同的主键值所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。