【发布时间】:2018-07-21 08:20:55
【问题描述】:
我遇到了一个问题,我想为一个子类型插入一条记录,并为基类型插入一条现有记录。
基本类型可以是由以下描述的 Person 实体:
public class Person {
[Key, Column("Id"), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public DateTime? BirthDate { get; set; }
}
具有以下描述的子类型:(更新:这里也没有真正的 Id 字段)
public class Employee : Person {
public DateTime HireDate { get; set; }
}
我的创作可以这样说明:
var employee = new Employee
{
Id = 1,
HireDate = DateTime.Now
});
context.Employees.Add(employee);
context.SaveChanges();
SQL Server 数据库有两个表,Persons 和 Employees,在 Id 字段之间有一个外键,Person.Id 是自动生成的。
----------- -------------
| Persons | | Employees |
----------- -------------
| Id | 1 to 0..1 | Id |
----------- -------------
虽然这类似于 EF-Code First,但我通过编写 POCO 手动实现它,然后在 SSMS 中手动创建表。
现在,有一条 Id = 1 的人员记录。当我尝试创建一个新员工并将 Id 分配为 1 时,Entity Framework 将忽略我的 Id 分配并使用生成的 Id 插入一个全新的人员记录从中分配 Employee 表的 Id。
如何使用现有人员记录创建员工记录?我真的很想探索这个想法。但是,如果不可能:有什么替代方法?
【问题讨论】:
-
EF 无法做到这一点。您正在解释的场景更像是从 Person 到 Employee 的 1 到 0.1,而不是继承。
-
通过使用TPT,你只是说你想在一个表中插入不同的对象,这些对象有一些共同的字段。实体框架将创建一个表,其中每个字段有一列,最后一列鉴别器告诉您该字段中存储了哪种对象。您不能将一个对象转换为另一个对象。
-
@IvanStoev 是的,您对关系为 1 到 0...1 的解释是正确的。谢谢!我会更新这个问题。你确定这不能用 EF 完成吗?
-
当被建模为继承时,实体要么是
Person要么是Employee。 IE。您不能插入代表相同Person的第二条记录。如果Person应该变成Employee,则必须删除Person并插入新的Employee。
标签: c# sql-server entity-framework-6 ef-code-first poco