[英]How to add an object multiple times in different tables with Entity Framework Core [Tracking error]
为了简化,我有一个“项目”类型,可以包含几个“经理”和几个“员工”。 每个 Employee 和 Manager 都由一个“Id”和“Person”属性组成。
public class Project
{
...
public ObservableCollection<Manager> Managers { get; set; }
public ObservableCollection<Employee> Employees { get; set; }
}
public class Manager
{
public int Id { get; set; }
public Person Person { get; set; }
}
public class Employee
{
public int Id { get; set; }
public Person Person { get; set; }
}
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
我通过以下方式从数据库中检索有关项目的信息:
Project project = context.Set<Project>()
.Include(p => proj.Managers).ThenInclude(d => d.Person)
.Include(p => proj.Employees).ThenInclude(e => e.Person)
.FirstOrDefault(p => p.Id == id);
当我想修改参与项目的员工时,我 select 来自人员列表的员工
List<Person> Persons = context.Set<Person>().AsNoTracking().ToList();
...
theCurrentProject.Employees.Add(new Employee{ Person = theSelectedPerson});
然后当我调用 context.SaveChanges(); 时,如果 Person 已经存在于 Managers 列表中并且我还将它添加到 Employees 中,则会发生以下错误:无法跟踪“Person”类型的实例,因为另一个实例具有键值“{Id:x}”已被跟踪。
我做错了什么,但我看不到是什么。 我了解在从数据库加载信息时,项目中存在的不同“人员”被 EF “跟踪”,因此来自人员列表的人员与已经跟踪的人员不同。 这就是为什么我尝试添加 AsNoTracking() 但没有成功。 “人”在这个软件中是只读的(我不需要跟踪他们)。 我怎样才能使这项工作? 还有可能如何告诉 EF 这样或这样的 object 是只读的并且它不应该尝试修改(跟踪)它们? 我尝试了 4-5 种不同的方法,但没有一个能解决我的问题。 提前致谢 !
尝试这个:
var employee=new Employee{ PersonId = theSelectedPerson.Id};
context.Set<Employees>.Add(employee);
context.SaveChanges();
// get saved employee
var savedEmployee = context.Set<Employees>()
.Include (p=>p.Person)
.AsNoTracking()
.FirstOrDefault(e=>e.Id=employee.Id);
//or
var savedEmployee = context.Set<Employees>()
.Include (p=>p.Person)
.AsNoTracking()
.FirstOrDefault(e=>e.PersonId=theSelectedPerson.Id);
但在此之前,您必须修复类中的错误
public class Manager
{
public int Id { get; set; }
public int PersonId { get; set; }
public Person Person { get; set; }
}
public class Employee
{
public int Id { get; set; }
public int PersonId { get; set; }
public Person Person { get; set; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.