将集合包括在实体中是否违反了实体的定义



我正在使用Dapper for.NET Core构建一个Web API,并试图遵循干净的体系结构原则。API由外部Angular前端使用。

我有一些存储库使用Dapper从数据库中检索数据,然后这些数据通过一个服务映射到DTO中以显示给用户。

我的理解是,实体应该是数据库对象的精确表示,没有额外的属性,如果我需要一些额外的属性来向用户显示(或者如果我也想向用户隐藏某些属性(,我应该使用DTO。

假设我有一个DTO:

public class StudentDTO
{
public Guid Id { get; set; }
public string Name { get; set; }
public List<Assignment> Assignments { get; set;}
}

及其对应实体:

public class Student
{
public Guid Id { get; set; }
public string Name { get; set; }
}

有了这个模型,如果我想让一个学生完成他们的所有作业,我需要调用两个存储库,并在服务中做这样的事情:

public StudentDTO GetById(Guid id) 
{
var student = this.studentRepository.GetById(id);
var assignments = this.assignmentRepository.GetByStudentId(id);
return SomeMapperClass.Map(student, assignments);
}

但这似乎没有效率,也没有必要。我的问题是,当我使用JOIN在存储库中获取学生实体时,我不应该只检索作业吗?或者这会违反实体的本质吗?

我很抱歉,我确实意识到这是一个相当简单的问题,但我真的很想知道哪种方法是最好的方法,或者他们是否都有自己的用例

我认为它会更高效,因为地图使用反射,这比慢几十倍

public StudentDTO GetById(Guid id) 
{
var student = this.studentRepository.GetById(id);
student.Assignments = this.assignmentRepository.GetByStudentId(id);
return student;
}

但常见的方法是

return _context.Students.Include(i=>i.Assignments).FirstOrDefault(i=> i.Id==id);

这就是为什么在大多数情况下,通用存储库是个坏主意,因为很难猜测您需要什么数据集。

最新更新