繁体   English   中英

如何使用 Entity Framework Core 在不同的表中多次添加 object [跟踪错误]

[英]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.

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