我应该在哪个层放置.edmx并生成POCO类?

时间:2012-12-12 07:14:27

标签: asp.net-mvc entity-framework architecture domain-driven-design

这是关于使用EF DB First模型的分层设计。

到目前为止,我之前没有使用过Entity Framework,只使用了Entities并将其放在了与Domain / DTO子文件夹不同的项目中。在DataAccessLayer,业务层和MVC应用程序中也引用相同的内容,并使用通常的ADO.Net查询编写代码并准备我的实体的POCO。没问题。

现在我们使用Entity Framework DB First模型开发应用程序。我们选择此DB First模型,因为DB Design不在我们的控制范围内。它由DBA完成。

我想在这里重用旧的简单设计。但不确定我应该在哪个/哪个层完全适合edmx文件和生成的POCO类。我没有找到任何采用分层架构风格的样本使用DBFirst方法。

我提到了这一点。 http://aspnetdesignpatterns.codeplex.com但他们使用NHybernate

以下是旧设计的高级概述。enter image description here

有关设计/样品的任何建议,欢迎您。

修改

从下面的回答中,我认为实体框架产生了POCO,我们可以将现有的Entities / Domain层重命名为Domain Layer,并将生成的POCO类放在那里。此外,我们可以简单地将DataAccessLayer中的.edmx保存为包含EF for TDD的IRepository类列表。这是否有意义?或任何有价值的观点?

更新

  

目前我删除了DataAccessLayer并仅保留实体层   有一个model.edmx文件和EF生成的类以及所有   实现IRepository的存储库类。我把它引入   业务层,MVC也是如此。我做对了吗?我觉得我在做   一个糟糕的设计:(请建议/帮助

4 个答案:

答案 0 :(得分:1)

由于您不幸被首先创建数据库的决定严重阻碍,因此您需要使用Anti-Corruption layerEric Evans' Domain-Driven Design

这是一个很好的解决方案,当您获得一个绝对必须编写代码的糟糕接口时,该怎么做 - 将数据库中的接口包裹起来,以您希望的方式运行。不要将任何EF类直接暴露给除反腐败层本身之外的任何东西。

以下是阅读示例:

public class SomeReadService : ISomeReadService {
  public SomeViewModel Load(Guid id) {
    using (var dbContext = new DbContext()) {
      // Query the DB model, then *map* the EF classes to SomeVieWModel.
      // This way you are not exposing the shitty DB model to the outside world.
    }
  }
}

这是一个写作示例:

public class SomeRepository : ISomeRepository {
  public SomeDomainObject Load(Guid id) {
    using (var dbContext = new DbContext()) {
      // Map the EF classes to your domain object.  Same idea as before.
    }
  }
}

我仍然会尝试向客户证明,拥有一个单独的团队设计数据库将是一场灾难(我的经验强烈表明它会)。看看是否有某种方式可以提供反馈,向客户证明如果您设计数据库会更好。

答案 1 :(得分:1)

请参阅以下类似问题的SO链接:

With a database-first approach, how do I separate my Core and Infrastructure layers?

希望这会有所帮助!!

答案 2 :(得分:0)

在我看来,正确使用的实体框架否定了对单独DAL的需求。我认为EF是我的DAL。它使您可以更专注于业务部分。 EF为您完成所有数据访问代码。您只需在业务层中使用EF上下文即可。对我而言,这是EF的最佳好处之一;这是你的DAL。

取决于您分层的方式(不同的程序集或程序集中的不同文件夹)取决于放置POCO类的位置。如果不同的程序集(对于大多数项目来说都是过度杀伤)那么所有其他程序引用的“公共”程序集就是放置POCO类的地方。如果是不同的文件夹,则会出现名为“Models”或“DomainModels”的文件夹。

特别是对于MVC应用程序,我会将我的POCO类放在'Models'文件夹中(我也有一个'ViewModels'文件夹),我的.Edmx放在BLL文件夹中,我有时称之为'Logic'。

如果您需要一个松散耦合的体系结构进行测试,那么将在您自己的存储库模式中包含一个名为Repositories的文件夹包含EF上下文。

答案 3 :(得分:0)

修改

简答是数据访问层(DAL)

您需要企业架构并根据您的需求进行更改,但在您的情况下模型驱动设计模式是可靠的解决方案。 您可以使用 MVC ,您可以从 Poco 或其他实体(如 NHibernet 等)推送您的模型。

没有任何重要性关于代码优先 db-first ,仅在架构创建阶段就很有趣。