实体框架"实体对象不能被IEntityChangeTracker的多个实例引用"

And*_*ril 7 c# entity-framework entity-framework-6

我收到了错误

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

尝试创建新实体并将其保存到数据库时.

我理解错误以及它通常如何发生,但在这种情况下,我所做的只是创建一个新实体并int在保存之前添加几个s,而不是从其他上下文添加任何其他实体.

我已经包含了导致错误的函数.正如你所看到的那样,它被传递了EndProduct一个实体,它被一个不同的上下文跟踪到了一个实体_billableRepository,但是由于我不想尝试将该实体分配给新创建的计费,我看不出如何这可能是个问题.

我能看到错误发生的唯一方法是因为int分配给new的Billable一些值是从EndProduct不同上下文跟踪的现有值中获取的,但肯定IEntityChangeTracker不会跟踪实体的各个原语?

public void AddBillable(EndProduct endProduct, int? purchaseId, string centreCode, int userId)
{
    if (endProduct.Product != null)
    {
        var existingBillableForUserForProductId = _billableRepository.GetQuery(b => b.UserId == userId && b.ProductId == endProduct.ProductId);
        if (endProduct.BillablePartId != null && !existingBillableForUserForProductId.Any())
        {
            var billable = new Billable {
                ProductId = endProduct.ProductId.Value, //int
                UserId = userId, //int
                PartId = endProduct.BillablePartId.Value, //int
                DateAdded = DateTime.UtcNow, //datetime
                PurchaseId = purchaseId, //int 
                CentreCode = centreCode //string
            };

            _billableRepository.Add(billable); //error here
            _billableRepository.UnitOfWork.SaveChanges();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Der*_*rek 11

最可能的原因是您正在使用的任何依赖注入工具.

DbContext每个单位的工作应该只有一个.如果您每次都要新建一个新的,请确保旧的处理器被丢弃.

否则,您将具有相同上下文的多个实例并排运行.

这是变更跟踪器混淆的地方,无法跟踪您的实体的变化.


小智 5

在您的模型上(GetById method)尝试放置如下内容:

var billable = _db.Billable.AsNoTracking().SingleOrDefault(i => i.BillableId == id);

使用AsNoTracking()以便它返回一个新查询,其中实体不会被缓存在System.Data.Entity.DbContext