我知道我的问题有点困惑,但是让我详细解释。
假设我有这样的人类。
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#中执行类似的操作?
答案 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或默认。但是,此时,您可以进行必要的更新并将其保存回去。