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等).
1)我应该在这个应用程序中有域对象吗?
只有你能回答这个问题; 正确答案高度取决于您对数据库查询结果的处理方式.如果在C#代码中有一些特定于字段的逻辑,则使用DTO(POCO实体类)是有意义的.但有时您可能只想执行一些查询并将结果作为JSON返回,在这种情况下,DTO可能过度.
2)我的sql查询结果是否应始终与域对象绑定?
不,这取决于你.您可以DbDataReader直接使用它来处理查询结果,或将它们加载到DataTable(或类似的更轻量级的结构,可以由您的数据访问库提供).
3)如果我不使用域对象,那么我是否总是从数据访问层返回自定义模型,其中包含我想要在web api服务中返回的所有内容?
如果您不使用POCO模型,您可以在代码中组合JSON并将其作为ActionResult返回.
4)如果我使用域模型,并且存在我想要显示来自多个表的数据的场景
如果你不在这里使用像EF 2这样的ORM案例:
List<Employee>和List<Skills>这些员工).然后,如果您需要访问具体"父"实体的子节点,请使用LINQ执行其他过滤.如果您不想使用EF或Dapper,您还可以检查我的库,该库可以与POCO模型一起使用,也可以与DataTable等通用结构一起使用(除此之外它还提供RecordSet结构).
小智 2
实体框架和引用对象的延迟加载是一种合理的方法。要扩展您的模型,请考虑以下事项。
创建一个链接 Employee 和 Skills 表的 SQL Server 视图,并将其添加到 EF 模型中。视图可以是您想要的最小或最大(例如,最小的仅在对象 ID 中,或者最大的在所有字段中)。
从此视图中,选择具有特定技能 ID 的所有记录,现在您就拥有了所需的员工。由于视图是在 SQL Server 中编译的,因此生成速度会尽可能快。
您还可以在代码中加入 Employee 和 Skill 对象并仅返回员工。在 LINQ 中,您可以查看为代码生成的 SQL
| 归档时间: |
|
| 查看次数: |
495 次 |
| 最近记录: |