相关疑难解决方法(0)

ASP.NET MVC - 附加"MODELNAME"类型的实体失败,因为同一类型的另一个实体已具有相同的主键值

简而言之,在POSTing包装器模型期间抛出异常并将一个条目的状态更改为"已修改".在更改状态之前,状态设置为'Detached'但调用Attach()会产生相同的错误.我正在使用EF6.

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

模型

// Wrapper classes
        public class AViewModel
        {
            public A a { get; set; }
            public List<B> b { get; set; }
            public C c { get; set; }
        }   
Run Code Online (Sandbox Code Playgroud)

调节器

        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 …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc entity-framework

118
推荐指数
7
解决办法
14万
查看次数

附加类型的实体失败,因为相同类型的另一个实体已具有相同的主键值

错误消息:附加类型的实体失败,因为同一类型的另一个实体已具有相同的主键值.

问题:如何以类似的方式附加实体,如下面的代码中的AttachActivity方法所示?

我必须假设上面的错误消息的"另一个实体"部分是指存在于内存但超出范围(??)的对象.我注意到这一点,因为我尝试附加的实体类型的DBSet的Local属性返回零.

我有理由相信实体在上下文中不存在,因为我逐步完成代码并在创建时观察上下文.在创建dbcontext之后,实体将立即添加到几行中.

我正在测试这里指定的附加实体:找出实体是否附加到dbContext的最合理方法是什么?

当在visual studio的locals窗口中查看本地时,我看到没有类型为Activity的实体(无论ID),除了我想要附加的实体.

代码按以下顺序执行:Try - > ModifyProject - > AttachActivity

代码在注释行的AttachActivity中失败.

请注意调试注释之间的代码,如果已将任何实体添加到上下文中,则将抛出该代码.

private string AttachActivity(Activity activity)
    {
        string errorMsg = ValidateActivity(activity);  // has no code yet.  No. It does not query db.

        if(String.IsNullOrEmpty(errorMsg))
        {
            // debug 
            var state = db.Entry(activity).State; // Detached
            int activityCount = db.Activities.Local.Count;
            int projectCount = db.Activities.Local.Count;

            if (activityCount > 0 || projectCount > 0)
                throw new Exception("objects exist in dbcontext");
            // end debug
            if (activity.ID == 0)
                db.Activities.Add(activity);
            else
            {
                db.Activities.Attach(activity); …
Run Code Online (Sandbox Code Playgroud)

.net c# entity-framework

8
推荐指数
2
解决办法
2万
查看次数

标签 统计

c# ×2

entity-framework ×2

.net ×1

asp.net-mvc ×1