实体框架使用流畅的API继承了一对一到一个关系配置
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架使用流畅的API继承了一对一到一个关系配置相关的知识,希望对你有一定的参考价值。
通过搜索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-to-Zero-developer)
- 然后将该员工提升为开发人员(One-employee-to-One-developer)
我该如何配置我的Context
课程?我还要感谢这个场景的示例代码。
答案
你不能像看起来那么简单。您必须从上下文中删除第一个实体,将其克隆到新对象-Developer
here-,并将新的实体添加到上下文中。
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中提到的那样,无法更改方案。所以忽略它。
以上是关于实体框架使用流畅的API继承了一对一到一个关系配置的主要内容,如果未能解决你的问题,请参考以下文章
使用实体框架 4.1 代码优先方法将一对一的表关系映射到单个实体