实体框架通过流畅的API继承了1到0到1的关系配置

本文关键字:配置 关系 继承 API 框架 实体 | 更新日期: 2023-09-27 18:06:10

我通过搜索SO个问题和谷歌周围找不到答案。

我有一个非常简单的结构:

public class Employee
{
   property int Id { get; set; }
   property int Name { get; set; }
}
public class Developer : Employee
{
   property string Level { get; set; }
}

和我有这个域模型的两个表:

create table Employees
(
    Id int not null primary key identity(1, 1),
    Name nvarchar(100) not null
)
create table Developers
(
    Id int not null primary key,
    Level nvarchar(100)
)
alter table Developers 
add constraint FK_Developers_Employees 
foreign key ([Id]) references Employees ([Id])

此c#模型和SQL Server数据库模式不能更改。场景如下:

  1. 首先添加一个员工(One-employee)
  2. 该员工还不是开发人员(One-employee-to-Zero-developer)
  3. 然后将该员工提升为开发人员(One-employee-to-One-developer)

我应该如何配置我的Context类?

实体框架通过流畅的API继承了1到0到1的关系配置

这并不像看上去那么简单。您必须从上下文中删除第一个实体,将其克隆到新对象(此处为Developer)中,然后将新实体添加到上下文中。

var emp = _context.Employees.Find(id);
_context.Delete(emp);
var dev = new Developer(/* clone from emp */);
_context.Developers.Add(dev);
_context.SaveChanges();

这将改变员工的Id。但是,如果您想避免这种情况(更改Id),则必须使用原始SQL—例如调用存储过程—向Developers添加一行并重新加载上下文。

另一个选项是自定义设置Id列,正如您在Q中提到的,不可能更改方案。所以忽略它