[英]An entity object cannot be referenced by multiple instances of IEntityChangeTracker. with 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.