繁体   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