[英]How to Implement CRUD using Entity Framework Core TPT Inheritance with SQL Server
鑒於以下...
這是我的 object model:
public class Person
{
public Person() { }
public Guid PersonId { get; set; } = Guid.NewGuid();
public String FirstName { get; set; } = string.Empty;
public String MiddleName { get; set; } = string.Empty;
public String LastName { get; set; } = string.Empty;
}
public class JobApplicant : Person
{
public JobApplicant() { }
}
public class Employee : Person
{
public Employee() { }
}
這是我的 DbContext 中的內容:
public DbSet<Employee> Employees { get; set;}
public DbSet<JobApplicant> JobApplicants { get; set; }
public DbSet<Person> Persons { get; set; }
var person = mb.Entity<Person>();
person.HasKey(aa => aa.PersonId);
這是我在 web api function 中所做的簡短版本:
Employee newEmployee = new Employee();
newEmployee.PersonId = "Guid value here";
db.Employees.Add(newEmployee);
db.SaveChanges();
在數據庫中,我有一個Person
、 JobApplicant
和Employee
表。 Person
表有一個PersonId
作為 PK。 Employee
和JobApplicant
都有一個PersonId
字段,它既是他們表的主鍵,也是Person
表的 FK。 這是 EF 使用 Code First 方法通過遷移生成的。
場景是我試圖添加為員工的人已經存在於 Person 表中,因為他們是通過JobApplicant
添加到其中的,但他們不存在於 Employee 表中,我正在嘗試為他們插入一條記錄Employee 表,但所有這些都到位了,我目前在執行db.SaveChanges()
時收到以下錯誤:
SqlException:違反主鍵約束“PK_Person”。 無法在 object 'dbo.Person' 中插入重復鍵。 重復鍵值為 (f73190f2-d766-4199-9dcd-2831c0844141)。
處理這種情況的正確方法是什么?
在您的場景中,使用 inheritance,真實身份是 JobApplicant 和 Employee。 Person 實體只是為了方便存儲可能存在於 JobApplicant或Employee 中的類似信息。
我認為您需要將 Person 本身視為唯一身份並使用關系,而不是 inheritance。
public class Person
{
public Person() { }
public Guid PersonId { get; set; } = Guid.NewGuid();
public String FirstName { get; set; } = string.Empty;
public String MiddleName { get; set; } = string.Empty;
public String LastName { get; set; } = string.Empty;
}
public class JobApplicant
{
public JobApplicant() { }
public Guid JobApplicationId { get; set; } = Guid.NewGuid();
public Person PersonalInfo { get; set; }
}
public class Employee
{
public Employee() { }
public Guid EmployeeId { get; set; } = Guid.NewGuid();
public Person PersonalInfo { get; set; }
}
然后,您可以在 JobApplicant 和 Employee 中使用相同的 Person (PeronalInfo)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.