无法跟踪实体类型“插座”的实例,因为已经跟踪了另一个具有键值的实例

问题描述

我想在存储员工工资时使用AddRange()方法。但是在执行context.context.EmployeeSalaries.AddRange(employeeSalaries);时我得到了异常

无法跟踪实体类型“ Outlet”的实例,因为已经跟踪了另一个具有键值的实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。

这是方法

public bool PaySalary(List<EmployeeSalary> employeeSalaries)
{
    using (DatabaseContext context = new DatabaseContext())
    {
        context.EmployeeSalaries.AddRange(employeeSalaries);
        context.SaveChanges();
    }
}

EmployeeSalary类结构:

public class EmployeeSalary
    {
        public int Id { get; set; }
        public float SalaryPerDay { get; set; }
        public float Days { get; set; }
        public float PaidSalary { get; set; }
        public DateTime DateTime { get; set; }
        public virtual Outlet Outlet { get; set; }
        public virtual User Employee { get; set; }
    }

有什么建议我可以快速做到吗?

解决方法

问题在于,在您的 EmployeeSalary 对象列表中,有两个或多个引用具有相同键但不完全相同的对象的 Outlet 对象。如果您在保存这些 EmployeeSalary 对象时不需要保存 Outlet 对象,那么您可以通过将每个 EmployeeSalary.Outlet 设置为 null 来解决这个问题