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