在具有相同模式的多个数据库中使用EF(或其他.NET ORM)

时间:2013-12-06 15:01:49

标签: .net entity-framework nhibernate orm

你必须原谅我对EF和/或ORM术语的无知。我熟悉ORM及其目的,但我很难找到是否支持我的用例。

我为不同的客户端提供了独特的数据库,分布在3个数据库服务器上。但是,这些不同数据库的模式是准确的。我的问题是,我怎样才能让EF(或其他.NET orm [NHibernate?])支持这种类型的架构?当我从DB生成模型时,它似乎为该单个数据库创建了一个连接字符串。我需要它来确定在运行时使用的正确连接字符串。

因此,为每个唯一的客户端数据库(不会扩展)保存生成模型,我该怎么办?

感谢您的帮助或指导。

3 个答案:

答案 0 :(得分:2)

无法编写一般答案,因为每个ORM都有自己的规则(我将其设为社区wiki以合并其他答案)。

的EntityFramework

它将使用哪个数据库用连接字符串声明(通常在app.config文件中)。当你创建你的上下文时,它将读取默认值,但是有一个构造函数接受它作为参数:

string connectionString = "...";
using (var repository= new MyRepository(connectionString))
{
}

通常EF连接字符串定义(在其自己的模型数据之后)提供者的标准连接字符串:

provider=System.Data.SqlClient;provider connection string= "data source=tcp:serverName;initial catalog=databaseName;user id=username;

不要忘记从代码中逃避"。您可以从app.config文件中读取完整的连接字符串(以便将其用作搜索和替换的模板)。在这种情况下,您:“让我们使用与Microsoft SQL Server的连接,这是它的连接字符串”。只需将initial catalog更改为您要连接的数据库即可。

的DevExpress

string connectionString = "...";
XpoDefault.DataLayer = XpoDefault.GetDataLayer(
    connectionString,
    AutoCreateOption.DatabaseAndSchema);

光速

继承ConnectionStrategy并覆盖Connection属性。要使用它,您可以设置ConnectionStrategy对象的ModelUnitOfWork属性。

NHibernate的

继承NHibernate.Connection.DriverConnectionProvider类并覆盖GetConnection()方法。有关详细信息,请参阅this example

答案 1 :(得分:0)

举一些例子:

使用DevEpxress XPO ORM时,您可以执行以下操作:

XpoDefault.DataLayer = XpoDefault.GetDataLayer("TheConnectionString, AutoCreateOption.DatabaseAndSchema);

首先使用EF代码

public class SiteContext : DbContext
{
    public SiteContext(): base("TheConnectionString")
    {

    }
}

使用LightSpeed ORM时:

请参阅链接:http://www.mindscapehq.com/documentation/lightspeed/Building-Applications-with-LightSpeed/Customising-How-LightSpeed-Connects-to-the-Database

在我看来,选择哪种ORM很困难,我现在要输入的内容有点偏颇:

  1. DevExpress ORM XPO。伟大的ORM Mapper,特别是与XAF等产品线一起使用时。他们的支持非常好。

  2. 首先使用EF代码非常简单。有传闻称与其他ORM地图制作者相比,它相当缓慢。

  3. Mindscape Lightspeed专注于速度和设计时间功能。非常好的支持。

  4. 我参与了使用NHibernate作为ORM映射器的项目。一般意见是它是高度可定制的。我曾参与过那些EF在映射Oracle现有数据库时失败的项目,而NHibernate没有这样做。 NHibernate是一个不容易学习的新手。

    对于您的情况,首先必须检查ORM映射器如何处理您的数据库模型。

答案 2 :(得分:0)

我刚刚扩展了我们的系统以支持多租户,其中每个租户都由一个独立的数据库支持。我们的系统使用NHibernate。

我的解决方案很简单:只需继承NHibernate.Connection.DriverConnectionProvider类,重写GetConnection()方法即可返回正确的连接。有了这个,您可以使用一个SessionFactory对象来管理具有相同模式的多个数据库。

当然,实施要复杂得多,但它涉及整个系统从单租户到多租户。