繁体   English   中英

IEntityChangeTracker EF6的多个实例不能引用一个实体对象

[英]An entity object cannot be referenced by multiple instances of IEntityChangeTracker EF6

我有以下代码,其中似乎userManager创建了不同的DBContext,而我的companyListService使用了不同的DbContext。 结果我收到错误消息说

一个IEntityChangeTracker的多个实例不能引用一个实体对象

           if (ModelState.IsValid)
            {
                try
                {
                    _companyListService.AddCompanyList(
                    new CompanyList(_userManager.FindById(GetUserId()), vm.Name));

                   _companyListService.SaveCompanyList();
                }
                catch (Exception e)
                {
                    _nlogger.Error(e);

                    ViewData["EditError"] = e.Message;
                }
            }

我该如何解决这个问题? 有什么办法可以停止在userManager dbcontext中进行跟踪? 还是使用相同dbcontext的更好方法? 该应用程序使用身份2。

我可以更改代码以传递userId而不是通过用户对象解决问题,但我想将用户对象传递给我。

当我关闭跟踪时

Configuration.AutoDetectChangesEnabled = false;

该问题也已解决,但这会按照我们的要求破坏其他部分。

解决此问题的最佳方法是什么?

谢谢,

恕我直言,这似乎是一个过于乐观的设计:您假定身份数据库和业务数据库将始终相同(换句话说:身份用户和业务使用来自同一表)。

基于相同的假设,我可以建议以下代码:

        if (ModelState.IsValid)
        {
            try
            {
                _companyListService.AddCompanyList(
                new CompanyList(_userManager.FindById(GetUserId()).UserPK, vm.Name));
                //------------------------------------------------^
                //or in the optimistic design :):
                //new CompanyList(GetUserId(), vm.Name));

               _companyListService.SaveCompanyList();
            }
            catch (Exception e)
            {
                _nlogger.Error(e);

                ViewData["EditError"] = e.Message;
            }
        }

public CompanyList(fkUserType fk, string name) {
    UserId = fk;
    Name = name;
}

在这种情况下,您必须显式声明和配置导航属性的外键。

public class CompanyList {
    public CompanyList(fkUserType fk, string name) {
        UserId = fk;
        Name = name;
    }

    public virtual User {get; set;}
    public fkUserType UserId {get; set;}
}

您可能已经注意到,构造函数不再使用实体,仅使用键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM