跨多个数据库构建数据层的最佳方法是什么?

时间:2009-01-06 17:29:27

标签: linq-to-sql entity-framework data-layers

首先介绍一下环境:

我们使用名为Clearview的程序来管理与客户的服务关系,包括呼叫中心和现场服务工作。为了更好地支持客户和我们的现场技术人员,我们还开发了一个网站,以便访问Clearview中的服务记录并进行报告。随着时间的推移,我们需要定制行为并添加新功能,这导致越来越多的东西被绑定到这个网站及其数据库。

此时我们处理的事情类似于公司在Clearview数据库中部分定义,部分在网站数据库中定义。为了更好的衡量,我们也开始将我们的电话系统的脚本绑定到同一个网站,这也需要与电话系统自己的数据库通信。

所有这些都已设置并正常工作......但我们没有良好的数据层来处理所有这些问题。我们转移到Linq to SQL,现在我们可以使用两个DBML,以及我在听过Linq之前编写的一些自定义类,以及一些旧式ADO数据集。所以是的,基本上事情都是一团糟。

我想要的是一个为我们的应用程序提供单个前端的数据层,并在后端将所有内容管理到正确的数据库中。

我听说过Entity Framework允许从多个源构建类,但事实证明只能有一个数据库。所以问题是,我怎么能继续这个呢?

我目前正在考虑为每个数据库设置所有Linq To SQL类,然后手动编写将这些组合在一起的Linq兼容前端。看起来很多工作,并且考虑到Linq的局限性(例如无法刷新),我不确定这是一个好主意。

我可以使用更好的实体框架吗?我应该研究另一种工具吗?我疯了吗?

3 个答案:

答案 0 :(得分:1)

实体框架确实提供了一定程度的数据库独立性,只要您可以从一个数据库构建实体模型,然后使用不同的实体连接字符串将其连接到不同的数据库。但是,正如您所说,它仍然只是一个数据库,而且,它仅限于支持实体框架的数据库。许多人,但不是全部。您可以在单个应用程序中使用多个实体模型,以便使用实体框架组合多个数据库。 ADO.NET团队博客上有一些相关信息。但是,实体框架对此的支持充其量只是在早期阶段。

我解决这个问题的方法是抽象使用Repository模式背后的Entity Framework。对我来说,最直接的好处是使单元测试变得非常简单;我只是替换了一个返回IQueryables的模拟存储库,而不是试图模拟我的Entity模型。但是,相同的模式对于组合多个数据源或没有实体框架提供者的数据源(例如非数据服务感知的Web服务)也非常有用。

所以我不会说,“不要使用实体框架。”我喜欢它,并且自己使用它。鉴于微软最近的消息,我认为它是比LINQ to SQL更好的选择。但它本身不会解决你描述的问题。使用存储库模式。

答案 1 :(得分:1)

如果你想使用像Linq2SQl或EF这样的工具,并且不想管理多个DBMLS(或者在EF或其他工具中调用它的whaetever),你可以在你的网站数据库中创建视图,这可以参考ClearView或Phone系统的DB。

这允许您将网站与其数据库结构分离。我相信Linq2Sql和EF可以使用视图作为实体的源。如果他们不能看nHibernate。

这也可以让您拥有从各种数据源中提取的复合实体。在SQL Server中更新视图有一些限制;但是,您可以在视图上定义自己的而不是触发器,然后可以执行实际的插入更新删除语句。

答案 2 :(得分:0)

L2S在我的项目中完美地与视图一起使用。你只需要做一个小技巧: 1.将辅助DB表作为视图添加到当前DB。 2.在Designer中,将主键属性添加到视图上的id字段。 3.仅限现在,将关联添加到原始数据库中所需的任何其他表。

现在,您可能会看到可用于导航的视图。