簡體   English   中英

如何使用 Entity Framework Core TPT Inheritance 和 SQL 服務器實現 CRUD

[英]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();

在數據庫中,我有一個PersonJobApplicantEmployee表。 Person表有一個PersonId作為 PK。 EmployeeJobApplicant都有一個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 實體只是為了方便存儲可能存在於 JobApplicantEmployee 中的類似信息。

我認為您需要將 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM