我计划创建一个具有以下层的应用程序,并使用 Entity Framework 作为我的 ORM:
介绍:与我的问题无关。
业务:在这一层我打算只使用 DTO 对象。我想让我的业务层与任何数据库实现细节分开,因此与实体的所有交互都在 DAL 层中完成。
DAL:在这一层中,我计划拥有所有实体框架代码和实体。我将介绍可由业务层调用的存储库。这些存储库期望 DTO 对象作为输入,并返回 DTO 对象作为输出。DTO和实体之间的映射是在这一层完成的。
我看了很多在线教程和与实体框架相关的文章,并遇到了DbContextScope项目,它似乎是控制“业务事务”并确保提交或回滚所有相关更改的非常好的解决方案。请参阅 GitHub:https ://github.com/mehdime/DbContextScope
该 GitHub 存储库中的演示包含一个在数据库中创建新实体的场景。当我尝试将该场景映射到我的图层时,它似乎是这样的:
业务:为要存储的实体创建具有属性值的 DTO。在传递 DTO 的 DAL 层中创建新的 DbContextScope 和调用存储库。
DAL:存储库将 DTO 映射到实体并将其添加到实体框架的 DbContext 中。
业务:在DbContextScope上调用 SaveChanges() 方法,后者又在 Entity Framework 的 DbContext 上调用 SaveChanges()。
在演示中,所存储实体的 ID 在创建 DTO 时已知。但是,我正在寻找一种方法来确定在业务层中调用 DbContextScope 上的 SaveChanges() 方法后由 EF 自动分配的 ID。由于此时我处于业务层,我无法再访问该实体,因此我无法再访问该实体的 ID 属性。
我想我只能通过查询数据库中刚刚创建的记录来确定 ID,但这只有在原始 DTO 包含一些我可以用来查询数据库的唯一标识符时才有可能。但是,如果我的 DTO 中没有可用于查询的唯一值怎么办?
关于如何解决这个问题的任何建议,或者您是否推荐我的图层的替代方法?(例如,也在业务层中使用实体——尽管这听起来是错误的做法)
森栏
相关分类