2

我已经将我的项目分成(截至此时)4层:

  • 应用程序(ASP.NET MVC 项目)
  • 域/模型(仅包含完全没有逻辑的模型)
  • BusinessLogic(现在只“包装”存储库)
  • DAL(实体框架,但应该是可互换的)

MVC 控制器使用业务逻辑“服务”通过业务逻辑层下方的任何内容与数据库对话,并且控制器不需要告诉任何人“我想要这个Student,我也想要他的所有Courses”——这意味着应该使用延迟加载。

问题是,如果我只是“调用”并将结果返回给调用控制器操作的任何人,除非我显式访问模型上的属性以触发图形的加载,否则我无法真正控制加载的内容。

我想使用 AutoMapper 从我的模型映射到 Dto(每个模型一个,它定义了返回的内容)。

假设我有这样的模型:

public class Student 
{
    public string Name {get;set;}
    public int Age {get;set;}
    public ICollection<Course> Courses {get;set;}
}

像这样的 dto:

public class StudentDto
{
    public string Name {get;set;}
    public ICollection<Course> Courses {get;set;}
}

当 AutoMapper 进行映射时,它似乎没有映射Courses,这是我的问题。

我应该在存储库层急切加载吗?

4

1 回答 1

2

正如您在 Student 和 StudentDto 中所拥有的那样,Automapper 应该将对象图正确地映射到 dto。这仅在启用延迟加载时才有效,否则您可能需要使用急切加载。

我认为选择使用哪种方法的最佳方法是测试这两种方法的性能,这将取决于几个因素,例如您在数据库中的数据模型以及 sql server 和您的应用程序之间的延迟等。
编辑.. 如何选择最佳方法
如何选择最佳方法 您需要考虑三件事,

  1. 您将与数据库建立多少连接。如果您正在使用延迟加载,并且引用的导航属性不在上下文中,则将对导航属性的所有参考点进行数据库调用。

  2. 您将从数据库中检索多少数据如果您选择在初始查询中以不同的加载方式加载所有数据,当您有大量数据要检索时,它会太慢。

  3. 查询的复杂性。当您使用延迟加载时,查询会很简单,因为所有数据都没有在初始查询中加载。如果您使用立即加载,它会使查询路径变得更加复杂

在这里阅读更多

于 2013-07-09T06:21:34.820 回答