簡體   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