【问题标题】:Mapping domain objects to result sets instead of tables将域对象映射到结果集而不是表
【发布时间】:2013-01-31 16:02:06
【问题描述】:

我正在开发一个使用现有数据库的应用程序,该数据库只能通过存储过程进行访问。大多数这些 SP 从多个表返回列。

我们有一个数据访问层,它从我们的域对象层返回类型的对象。但是,由于 SP 从多个表返回列,我不确定应该如何构造我的域对象,因为它们中的大多数不会“自然地”映射到从 SP 返回的数据。

示例: 存储过程从“员工”表和“经理”表返回列:
-EmployeeId
-名字
-姓
-ManagerEmployeeId
-ManagerFirstName
-ManagerLastName

我是否应该创建一个包含与上述列完全匹配的属性的域对象“EmployeeWithManager”?

我是否应该创建某种包含 Employee 对象和 Manager 对象的“数据访问对象”?

很遗憾,不能使用 ORM、参数化查询或更改存储过程。

【问题讨论】:

  • 我不明白你所说的使用 ORM 是什么意思,参数化查询不是一个选项?我只会创建 Manager 和 Employee 对象,因为域对象应该与域匹配。如果要获取员工,则调用 SP 并仅使用结果的员工部分,如果要获取经理,则调用 SP 并仅使用结果的经理部分。
  • @john 我的意思是我工作的公司不想使用 ORM 或参数化查询,而且我无法进行此更改。我必须通过现有的 SP 访问数据库。我意识到域对象应该与域匹配。我喜欢你的方法,但如果我在程序的特定部分需要员工和经理,我必须用相同的参数调用同一个 SP 两次。我更愿意获得整个结果,然后将其映射到我的域对象以避免两次往返。

标签: c# sql sql-server stored-procedures


【解决方案1】:

了解。这就是我要做的,仍然创建与您的域匹配的域对象。

原因

  1. 更容易理解
  2. 假设您使用一个 SP 创建 EmployeeWithManager,如果您有另一个 SP(例如 Employee with Car),您将需要创建 EmployeeWithCar 对象,列表继续,将无法管理,您将有很多工作尝试在它们之间进行转换

我的方法,

  • 创建两个域对象,Employee 和 Manager(您的 Manager 可以 甚至继承Employee)
  • 在 Employee 中,创建对 Manager 的引用/关系,例如
Class Employee{

    String Id;
    String FirstName;
    ...

    Manager EmployeeManager;

}
  • 创建数据访问层以使用您的 SP,例如
 Class EmployeeDAL{

        Employee GetEmployeeWithManager(string EmployeeId){
            //user data reader to populate your Employee object and fill it with Manager
            Manager m = New Manager(); //fill Manager from SP
            Employee e = New Employee(); //fill Employee from SP

            e.EmployeeManager = m;
            return e;
        }
    }
  • 在您的业务逻辑/UI 中,
Class EmployeeController{
     PopulateEmployee(string EmployeeId){
          Employee e = EmployeeDAL.GetEmployeeWithManager(EmployeeId);
          Databind(e);
          'you can also access your manager from e.EmployeeManager
     } 

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    相关资源
    最近更新 更多