0

我是实体框架的新手,我想了解一些关于 EF、LINQ、POCO 和存储库的观点。

我们有一个使用 EF 和 POCO 访问数据库的存储库的工作解决方案。我们通过上下文在 LINQ 中进行所有查询。我们将映射添加到在应用程序启动时加载的映射类中,因为数据库/表已经存在。

如果我有一个商业案例,我需要为特定公司计算员工为孩子购买的玩具数量。

我将如何建立存储库/存储库?

A:用一个存储库调用公司的所有员工,然后在服务层再次为每个员工的孩子调用另一个存储库,等等?

B:调用一个存储库,它会将所有员工、孩子和玩具归还给我公司?

A 在我看来更干净,我可以更频繁地重用存储库。但是 B 接缝更有效,但不能重复使用。更少的存储库和查询将变得越来越大。

这只是一个小例子……但我们有更大的业务案例。在这种情况下,最好的架构方法是什么?

class Company
{
    List<Employee> employees;
}

class Employee
{
    List<Child> children;
}

class Child
{
    List<Toy> toys;
}
4

2 回答 2

0

您无需调用存储库即可获取公司、员工、儿童和玩具!

我需要为特定公司计算员工为那里的孩子购买的玩具数量

所以你的商业案例是有一个数字,或者每个玩具有一个数字,或者每个员工有一个数字。您不需要加载所有这些实体并在您的应用程序中计算它。您只需要编写一个聚合查询(在 Linq 或 SQL 中)。这整个计算应该在数据库中运行。

如果您需要将查询隐藏在存储库后面,只需选择此业务案例所属的查询,并将查询公开为存储库的新方法。

于 2012-08-10T18:07:08.317 回答
0

虽然从来没有硬性规定,但对我来说,为每个聚合根(在您的示例中,公司)使用单个工作单元似乎最一致地工作以保持事物井井有条,并防止并发错误,因为它将处理所有的布线和管理你的对象。关于什么是工作单元,有一篇很棒的 MSDN帖子。那篇文章的摘录:

在某种程度上,您可以将工作单元视为转储所有事务处理代码的地方。工作单位的职责是:

  • 管理交易。
  • 对数据库的插入、删除和更新进行排序。
  • 防止重复更新。在 Unit of Work 对象的单一用法中,代码的不同部分可能会将同一个 Invoice
    对象标记为已更改,但 Unit of Work 类只会
    向数据库发出单个 UPDATE 命令。

使用工作单元模式的价值在于将其余代码从这些问题中解放出来,这样您就可以专注于业务逻辑。

有几篇关于这个的博客文章,但我发现的最好的一篇关于如何实现它是here。还有一些其他的已经从这个网站herehere中提到过。

A 在我看来更干净,我可以更频繁地重用存储库。但是 B 接缝更有效,但不能重复使用。更少的存储库和查询会变得越来越大。

通用存储库在这里处理您的问题,使您可以轻松地为每个数据对象创建一个存储库,同时使其可重用且易于测试。然后,您的业务逻辑可以在您的工作单元的服务层中处理,确保您没有并发问题。

于 2012-08-10T18:08:02.743 回答