实体框架使用流畅的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数据库架构。场景是:

  1. 首先添加一名员工(一名员工)
  2. 该员工还不是开发人员(One-employee-to-Zero-developer)
  3. 然后将该员工提升为开发人员(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 代码优先方法将一对一的表关系映射到单个实体

Hibernate框架学习之注解配置关系映射

在实体框架 6 中不起作用的实体之间的一对一关系

如何使用 Fluent API 配置从 AspNetUsers 表到...的一对多关系

使用实体框架的一对一关系

我是不是需要使用 Fluent API 配置与实体框架的关系的双方?