我可以将自己的类添加到实体框架吗?

时间:2013-11-20 14:24:11

标签: asp.net entity-framework

我想开始为我的项目使用Entity Framework。我们即将开始的一个新项目将有一个Employee表。我最初计划有一个IEmployee接口,它将由Manager和Staff类实现,它们将允许不同的功能,但都会将数据存储在Employee表中,表中的标志区分它们。

如果我使用DB First,并设计我的Employee表然后使用Entity Framework,我知道.tt文件将有一个部分类Employee。然后我可以创建自己的Manager和Staff类来实现部分类Employee。但是,我如何使用Entity Framework将其存储在数据库中呢?我可以做一些像

这样的事情
// currentManager would be the manager object
dbContext.Emplyee.Add(currentManager);
dbContext.SaveChanges();

即使我将一个Manager对象传递给Employee进行保存,实体框架也可以这样做吗?或者有更好的方法吗?与检索相同,我如何使用Entity Framework来取回经理或员工?我是否需要首先让员工回来再投出?像

这样的东西
var employee = from employees... // get employee
Manager currentManager = (Manager)employee;

1 个答案:

答案 0 :(得分:2)

是的,您可以首先使用EF DB,并且具有从公共基类派生的多个类,这些类存储在同一个数据库表中。

您设想的“标志”被EF称为鉴别器。它是表中的一列,用于指定记录是实例的哪个子类型。

首先使用数据库,您需要调整EF生成的模型以使其正常工作,但这非常简单。我认为最简单的设置方法是

  1. 在SQL中创建数据库模型,确保Employee表具有可用作鉴别器的{NULL}属性,如EmployeeType。我认为这可以是任何类型,但int可以正常工作。
  2. 创建您的EF模型(添加|新项目... |数据| ADO.NET实体数据模型),并映射Employee表(以及您需要的任何其他内容)。
  3. 双击生成的.edmx文件以打开实体框架设计器。
  4. 右键单击画布并选择添加新... |实体并创建一个源自Manager的{​​{1}}实体。重复Employee您的设计师应如下所示:Entities
  5. 右键单击Manager并选择表映射。在映射详细信息中,指定它映射到Staff.并添加当EmployeeType = 1 时的条件。对员工执行相同操作,但进行映射当EmployeeType = 2 时。screenshot of mapping details
  6. 最后,您需要从Employee映射中删除 EmployeeType属性。
  7. 完成后,您可以扩展EmployeeManager类(现在将由EF生成为部分类)以获得您想要的任何业务逻辑,并使用EF执行查询/等通过Staff映射:

    Employees