这是关于使用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
以下是旧设计的高级概述。
有关设计/样品的任何建议,欢迎您。
修改
从下面的回答中,我认为实体框架产生了POCO,我们可以将现有的Entities / Domain层重命名为Domain Layer,并将生成的POCO类放在那里。此外,我们可以简单地将DataAccessLayer中的.edmx保存为包含EF for TDD的IRepository类列表。这是否有意义?或任何有价值的观点?
更新
目前我删除了DataAccessLayer并仅保留实体层 有一个model.edmx文件和EF生成的类以及所有 实现IRepository的存储库类。我把它引入 业务层,MVC也是如此。我做对了吗?我觉得我在做 一个糟糕的设计:(请建议/帮助
答案 0 :(得分:1)
由于您不幸被首先创建数据库的决定严重阻碍,因此您需要使用Anti-Corruption layer每Eric 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 ,仅在架构创建阶段就很有趣。