将域对象映射到结果集而不是表

时间:2013-01-31 16:02:06

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

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

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

实施例: Stored Proc从“Employee”表和“Manager”表中返回列:
-EmployeeId
-FirstName
-LastName
-ManagerEmployeeId
-ManagerFirstName
-ManagerLastName

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

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

不幸的是,使用ORM,参数化查询或更改存储过程不是一种选择。

1 个答案:

答案 0 :(得分:1)

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

原因

  1. 易于理解
  2. 假设您使用一个SP创建EmployeeWithManager,如果您有另一个SP(比如雇员带汽车),则需要创建EmployeeWithCar对象,列表继续,将无法管理并且您将尝试大量工作在他们之间进行转换
  3. 我的方法,

    • 创建两个域对象,Employee和Manager(您的经理可以 甚至继承员工)
    • 在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;
            }
        }
    
    • 在您的业务逻辑/用户界面中,
    Class EmployeeController{
         PopulateEmployee(string EmployeeId){
              Employee e = EmployeeDAL.GetEmployeeWithManager(EmployeeId);
              Databind(e);
              'you can also access your manager from e.EmployeeManager
         } 
    
         

    }