【问题标题】:mvc3 jquery ajax post error "An entity object cannot be referenced by multiple instances of IEntityChangeTracker."mvc3 jquery ajax 发布错误“IEntityChangeTracker 的多个实例无法引用实体对象。”
【发布时间】:2023-04-01 10:15:01
【问题描述】:

我发现了很多关于这个错误的帖子,但没有一个有帮助,似乎其他人都在不同的情况下遇到了这个错误。但这是我的第一个 MVC 项目,所以也许我只是不明白 :) 所以,我有一个非常简单的 ajax 调用:

         $.ajax({
                type: "POST",
                url: "/Home/MyMethod",
                data: ({ SomeProperty:"someValue" }),
                success: function (data) {
                    var obj = jQuery.parseJSON(data);
                    alert(obj.Status);
                },
                error: function () {
                    alert("error");
                }
            });

还有非常简单的MyMethod控制器方法:

        [HttpPost]
        public JsonResult AddReport(MyModel model)
        {
            if (ModelState.IsValid)
            {
                db.MyModels.Add(model);
                db.SaveChanges();
                return Json(...);
            }
            else
            {
                //not good...
            }
        }

db.MyModels.Add(model); 行触发错误。我在管理区域中有另一个控制器来处理同一模型的 CRUD 操作,它工作得很好。我知道问题可能是model 已经附加到System.Data.Objects.ObjectContext 并且我必须将其分离,但我不知道该怎么做。有什么想法吗?

【问题讨论】:

    标签: jquery entity-framework asp.net-mvc-3


    【解决方案1】:

    您的 ObjectContext 的实例在哪里被实例化?通常,此错误表明 Entity Framework 认为另一个 ObjectContext 已经拥有它正在跟踪的对象的副本。

    您是在使用 ObjectContext 后将其丢弃,还是将其存储在会话中以供重复使用?当同一数据集有多个未处理的 ObjectContext 时,可能会出现这些类型的问题。

    另请参阅http://social.msdn.microsoft.com/Forums/en-IE/adodotnetentityframework/thread/501d7b99-0cb9-44b6-b2cd-16275a151b31 获取一些链接。

    【讨论】:

    • 我不知道 ObjectContext 是什么,也不知道它在哪里被实例化。我不知道我正在使用一个。我已经查看了该链接,但不清楚我必须做什么。
    • ObjectContext 是您正在使用的数据库对象。是否在您的代码中创建/分配了 db 对象?
    • 在控制器中,private MyDBContext db = new MyDBContext();。它实现了DbContext 并有一些public DbSet<MyModel> MyModels { get; set; }
    • 我终于明白发生了什么。在具有AnotherModel 引用的MyModel 中,我再次实例化数据库,因为MyModelAnotherModelId 属性需要是最新的AnotherModel 并且需要得到它。我将只实例化数据库一次,并将其存储在会话中。
    【解决方案2】:

    我遇到了同样的问题,但原因不同。我在一个新对象中有一个子集合,该对象正在填充一个在不同上下文中创建的子集合,如下所示:

    User newUser = new User
    {
        UserId = (Guid)user1.ProviderUserKey,
        Username = user1.UserName,
                   ...
        AuthorizedOrgs = new List<Org> { currOrg }
    };
    
    context.Users.Add(newUser);
    

    currOrg 导致错误,因为它是在不同的上下文中实例化的。

    改成这样就解决了问题:

    User newUser = new User
    {
        UserId = (Guid)user1.ProviderUserKey,
        Username = user1.UserName,
                   ...
        AuthorizedOrgs = new List<Org> { context.Orgs.Find(currOrg.Id) }
    };
    
    context.Users.Add(newUser);
    

    如您所见,我再次从当前上下文中检索了 currOrg。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多