【发布时间】:2011-07-17 09:48:12
【问题描述】:
我想我已经达到了“分析瘫痪”的状态。 我有一个 MVC 应用程序,使用 EF 作为 ORM。 因此,我正在尝试确定最佳数据访问模式,到目前为止,我认为将所有数据访问逻辑放入控制器中是可行的方法......但这听起来有点不对。 另一种选择是创建一个外部存储库,处理数据交互。 这是我的优点/缺点:
如果嵌入对控制器的数据访问,我将得到如下代码:
using (DbContext db = new DbContext())
{
User user = db.Users.Where(x=>x.Name == "Bob").Single();
user.Address.Street = "some st";
db.SaveChanges();
}
因此,有了这个,我获得了延迟加载的全部好处,我在完成后立即关闭连接,我在 where 子句上很灵活 - 所有细节。 缺点 - 我在一个方法中混合了一堆东西 - 数据检查、数据访问、UI 交互。
使用 Repository,我将数据访问外部化,如果我决定使用 ado.net 或使用不同的数据库,理论上可以替换 repos。 但是,我看不到实现延迟加载以及如何控制 DbContext/连接生命周期的好方法。 说,我有带有 CRUD 方法的 IRepository 接口,我将如何加载属于给定用户的地址列表?使 GetAddressListByUserId 之类的方法看起来丑陋、错误, 并且会让我创建一堆同样丑陋的方法,并且在使用 ORM 时毫无意义。
我确信这个问题已经解决了百万次,希望在某个地方有解决方案..
还有一个关于存储库模式的问题——你如何处理作为属性的对象?例如。用户有一个地址列表,您将如何检索该列表?为地址创建一个存储库?使用 ORM,地址对象不必通过 repo 引用回用户,也不必 Id 字段 - 它必须拥有所有这些。更多代码,更多公开属性..
【问题讨论】:
-
查看这个问题的答案:stackoverflow.com/questions/458146/…
-
在 SO...上搜索
IRepository模式,与 EF 相关。您会发现非常相似的实现 -
+1,因为现在我使用的是通用存储库模式 + 这些 GetAddressListByUserId 丑陋的方法 + 其他一些通用方法。
-
我认为直接在您的控制器(和其他顶级调用者)中执行数据访问存在很大的阻力。例如,请参阅The Onion Architecture、经典(如有争议)"Repository is the New Singleton" 和The evils of the repository abstraction layer 上的本系列文章。
标签: c# asp.net-mvc design-patterns orm asp.net-mvc-3