在Ado.net的情况下,DataAccess层返回域对象?

ILo*_*low 9 c# ado.net repository-pattern asp.net-web-api

我正在创建一个项目,我将使用ADO.NET作为数据访问层与数据库进行交互.

现在,我非常困惑的是:

1)我应该在这个应用程序中有域对象吗?

2)我的sql查询结果是否应始终与域对象绑定?

3)如果我不使用域对象,那么我是否总是从数据访问层返回自定义模型,其中包含我想要在web api服务中返回的所有内容?

4)如果我使用域模型,并且如果我想要显示来自多个表或这样的场景的数据,例如:

public class Employee
   {
      int id;
      List<Skills>();
   }
Run Code Online (Sandbox Code Playgroud)

我可以轻松地在EF中执行此操作,但是使用ado.net和域对象,其结构如下所示我将如何实现此目的:

public class Employee
   {
       int id;
   }

   public class Skill
   {
       int id;
       int EmployeeId;
   }
Run Code Online (Sandbox Code Playgroud)

Ofcouse我可以先获得员工名单,然后对于每个员工,我可以根据员工ID获得技能列表,但是这将是痛苦的,我将不得不为每个员工解雇查询以获得相应的技能,这在EF中非常简单基于导航属性并避免如下所示的开销:

var employees = //get listof employee in this case domain model 
                  List<Employee>
var employeeModel = new List<EmployeeModel>();
foreach(var employee in employees)
{
   EmployeeModel model = new EmployeeModel();
   model.id = employee.id;
   var skills = GetSkill(employee.id);//Get list of skills in this case 
                domain model List<Skill>;
   employeeModel.Skills =  new List<SkillModel>();
   foreach(var skill in skills)
   {
      SkillModel sm = new SkillModel();
      sm.Id = skill.Id;
      employeeModel.Skills.Add(smm);
   }
   employeeModel.Add(model);
}
Run Code Online (Sandbox Code Playgroud)

最后,这个EmployeeModel将在我的Web Api服务中作为响应返回,因此这个EmployeeModel将只保存我将在WebApi端点中返回的那些属性.

在使用ado.net作为数据访问层时应考虑的架构应该是什么,如果有人可以帮助我解决上述4个问题,我将非常感激.

注意:我不想使用ORM(实体框架或Dapper等).

Vit*_*nko 6

1)我应该在这个应用程序中有域对象吗?

只有你能回答这个问题; 正确答案高度取决于您对数据库查询结果的处理方式.如果在C#代码中有一些特定于字段的逻辑,则使用DTO(POCO实体类)是有意义的.但有时您可能只想执行一些查询并将结果作为JSON返回,在这种情况下,DTO可能过度.

2)我的sql查询结果是否应始终与域对象绑定?

不,这取决于你.您可以DbDataReader直接使用它来处理查询结果,或将它们加载到DataTable(或类似的更轻量级的结构,可以由您的数据访问库提供).

3)如果我不使用域对象,那么我是否总是从数据访问层返回自定义模型,其中包含我想要在web api服务中返回的所有内容?

如果您不使用POCO模型,您可以在代码中组合JSON并将其作为ActionResult返回.

4)如果我使用域模型,并且存在我想要显示来自多个表的数据的场景

如果你不在这里使用像EF 2这样的ORM案例:

  • 如果这是2个(或更多)连接表的结果:为此您可以为此查询结果准确添加特殊POCO模型,或使用像DataTable这样的通用数据容器来处理结果
  • 如果这是父子(1-N):执行2个查询并得到结果为2 POCO模型集合(比方说,List<Employee>List<Skills>这些员工).然后,如果您需要访问具体"父"实体的子节点,请使用LINQ执行其他过滤.

如果您不想使用EF或Dapper,您还可以检查我的库,该可以与POCO模型一起使用,也可以与DataTable等通用结构一起使用(除此之外它还提供RecordSet结构).


小智 2

实体框架和引用对象的延迟加载是一种合理的方法。要扩展您的模型,请考虑以下事项。

创建一个链接 Employee 和 Skills 表的 SQL Server 视图,并将其添加到 EF 模型中。视图可以是您想要的最小或最大(例如,最小的仅在对象 ID 中,或者最大的在所有字段中)。

从此视图中,选择具有特定技能 ID 的所有记录,现在您就拥有了所需的员工。由于视图是在 SQL Server 中编译的,因此生成速度会尽可能快。

您还可以在代码中加入 Employee 和 Skill 对象并仅返回员工。在 LINQ 中,您可以查看为代码生成的 SQL