【问题标题】:can I add my own classes to entity framework?我可以将自己的类添加到实体框架中吗?
【发布时间】:2013-11-20 14:24:11
【问题描述】:

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

如果我首先使用 DB,并设计我的 Employee 表,然后使用 Entity Framework,我知道 .tt 文件将有一个部分类 Employee。然后我可以创建自己的 Manager 和 Staff 类来实现部分类 Employee。但是,我将如何使用实体框架将其存储回数据库中?我可以做类似的事情吗

// currentManager would be the manager object
dbContext.Emplyee.Add(currentManager);
dbContext.SaveChanges();

即使我将 Manager 对象传递给 Employee 以保存,实体框架是否可以接受?还是有更好的方法来做到这一点?与检索相同,我如何使用实体框架来取回经理或员工?我需要先让员工回来然后再投吗?类似的东西

var employee = from employees... // get employee
Manager currentManager = (Manager)employee;

【问题讨论】:

    标签: asp.net entity-framework


    【解决方案1】:

    是的,您可以先使用 EF DB,然后将多个类派生自一个公共基类,这些类存储在同一个数据库表中。

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

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

    1. 在 SQL 中创建数据库模型,确保 Employee 表有一个 NOT NULL 属性,如 EmployeeType,可用作鉴别器。我认为这可以是任何类型,但 int 可以正常工作。
    2. 创建您的 EF 模型(Add | New Item... | Data | ADO.NET Entity Data Model),并映射 Employee 表(以及您需要的任何其他内容)。
    3. 双击生成的 .edmx 文件打开实体框架设计器。
    4. 在画布上单击鼠标右键并选择添加新... |实体 并创建一个派生自EmployeeManager 实体。重复Staff. 你的设计师应该是这样的:
    5. 鼠标右键单击管理器并选择表映射。在映射详细信息中,指定它映射到Employee 并添加条件When EmployeeType = 1。对 Staff 做同样的事情,但是使映射 When EmployeeType = 2.
    6. 最后,您需要从Employee 映射中删除EmployeeType 属性。

    完成后,您可以扩展 ManagerStaff 类(现在将由 EF 作为部分类生成)以拥有您想要的任何业务逻辑,并通过 @987654332 使用 EF 进行查询/等@映射:

    public class Manager : Employee
    {
        public void customManagerMethod() { }
    }
    
    public class Staff : Employee
    {
        public void customStaffMethod() { }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            using (var db = new dbfirstEntities())
            {
                Manager m = new Manager
                {
                    FirstName = "Joe",
                    LastName = "Bigshot"
                };
    
                Staff s = new Staff
                {
                    FirstName = "Joe",
                    LastName = "Schmoe"
                };
    
                db.Employees.Add(m);
                db.Employees.Add(s);
    
                db.SaveChanges();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多