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

时间:2019-07-15 08:09:30

标签: c# asp.net-core entity-framework-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#中执行类似的操作?

2 个答案:

答案 0 :(得分:0)

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

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

然后您将像这样employees[0].Person.Name进行操作,依此类推。

答案 1 :(得分:0)

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

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

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

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

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