实体框架通过流畅的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数据库模式不能更改。场景如下:
- 首先添加一个员工(One-employee)
- 该员工还不是开发人员(One-employee-to-Zero-developer)
- 然后将该员工提升为开发人员(One-employee-to-One-developer)
我应该如何配置我的Context
类?
这并不像看上去那么简单。您必须从上下文中删除第一个实体,将其克隆到新对象(此处为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中提到的,不可能更改方案。所以忽略它