繁体   English   中英

如何使用EF Core中的select方法获取所有以前的数据

[英]How to get all previous data by using select method in EF Core

我知道我的问题有点困惑,但是让我详细解释。
假设我有这样的人类。

public class Person {
  public int Id {get; set;}  
  public string Name {get; set;}  
}  

我想创建一个新实体,但是这两个类是类似的,所以我只想继承并添加一些新属性

public class Employee : Person {
  public string Position {get; set;}
}

一切正常,但是当我想从人员表中选择数据并将其添加到Employee类时遇到问题

employee = _context.Person.Select(
              a => new Employee {
              Name = a.Name,
              Position = "Programmer"
            }).ToList();  

因此,如您在此处看到的,我要添加position属性,但也要从人员表中获取先前的数据。 问题是,我必须手动输入人员表中的先前数据。 如果人员表具有很多属性,则需要键入所有属性以获取所有数据。 无论如何,有没有获得所有以前的数据而无需输入所有数据。 所以在javascript中有类似

new State = {
...State,
Position : "employee"
} 

是否可以在C#中执行类似的操作?

将员工作为实体,您可以使用

var employees = _context.Employee.Include(e=>e.Person).ToList(); 

那么您将像这样的employees[0].Person.Name等进行操作。

如果您了解我的意思,那么您实质上是想将现有的Person实体“升级”到Employee实体。 不幸的是,这并不像您想要的那样简单或直接。 EF Core通过带有歧视项列的单个表对继承进行建模。 当从数据库中拉出实体时,该鉴别符列通知应实际实例化哪种类类型。 由于已将其保存为Person ,因此它将以“ Person”作为值,并且当您从数据库中检索它时,EF Core将实例化Person实例。

然后,您可以将其转换为Employee ,但EF Core将不知道如何处理。 从技术上讲,向下转换的实例将不会被跟踪。 如果尝试跟踪它,则保存时会出错,因为EF Core会尝试添加与现有Person PK相同的新Employee 繁荣。

最好的选择是将Person实例中的数据映射到新的 Employee实例,包括所有关联的关系。 然后,创建Employee ,使关系在数据库级别移动,最后移除旧的Person

当然,这将导致分配新的PK(这就是为什么迁移相关实体很重要的原因),并且如果您有引用该PK的URL或只是在处理自动增加PK。 如果这样做,您最终会在键中留下空白,甚至有可能用完键。

唯一可能的替代方法是更改​​“鉴别符”列的值。 这必须通过直接的SQL来完成,因为discriminator列是EF Core不公开的shadow属性(即无法通过C#代码对其进行修改)。 但是,如果从字面上将值更改为类似于“ Employee”的值,则在获取它时,EF将创建一个Employee实例,所有Employee特定的属性都将为null或默认值。 但是,此时,您可以进行必要的更新并将其保存回去。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM