使用EF(或另一个.NET ORM)跨多个具有相同模式的数据库

使用EF(或另一个.NET ORM)跨多个具有相同模式的数据库,.net,entity-framework,nhibernate,orm,.net,Entity Framework,Nhibernate,Orm,您必须原谅我对EF和/或ORM术语的无知。我熟悉ORMs及其用途,但很难找到支持我的用例的ORMs 我有针对不同客户机的独特数据库,分布在3个数据库服务器上。但是,这些不同数据库的模式是精确的。我的问题是,如何让EF(或另一个.NETORM[NHibernate?])支持这种类型的体系结构?当我从数据库生成模型时,它似乎为单个数据库创建了一个连接字符串。我需要它来确定运行时要使用的正确连接字符串 那么,为每个唯一的客户机数据库保存生成模型(不会扩展),我能做什么 感谢您的帮助和指导。因为每个OR

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

我有针对不同客户机的独特数据库,分布在3个数据库服务器上。但是,这些不同数据库的模式是精确的。我的问题是,如何让EF(或另一个.NETORM[NHibernate?])支持这种类型的体系结构?当我从数据库生成模型时,它似乎为单个数据库创建了一个连接字符串。我需要它来确定运行时要使用的正确连接字符串

那么,为每个唯一的客户机数据库保存生成模型(不会扩展),我能做什么


感谢您的帮助和指导。

因为每个ORM都有自己的规则,所以不可能编写一个通用的答案(我将此作为一个社区wiki来合并其他答案)

实体框架 它将使用的数据库是用连接字符串声明的(通常在
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的连接,这是它的连接字符串。”“。只需将
初始目录
更改为要连接的数据库,即可完成

第三方控件 光速 从
ConnectionStrategy
继承并重写
Connection
属性。要使用它,可以设置
ModelUnitOfWork
对象的
ConnectionStrategy
属性

亚硝酸铵 继承自
NHibernate.Connection.DriverConnectionProvider类,并重写
GetConnection()
方法。有关更多详细信息,请参阅。

以给出一些示例:

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

XpoDefault.DataLayer = XpoDefault.GetDataLayer("TheConnectionString, AutoCreateOption.DatabaseAndSchema);
首先使用EF代码时

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

    }
}
使用LightSpeed ORM时:

见链接:

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

  • 开发XPO。伟大的ORM映射器,尤其是与他们的产品线(如XAF)结合使用时。他们的支持非常好

  • EF代码首先使用起来非常简单。有传言说,与其他ORM映射程序相比,它的速度相当慢

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

  • 我曾参与使用NHibernate作为ORM映射器的项目。一般认为它是高度可定制的。我曾在EF未能映射Oracle现有数据库的项目中工作过,而NHibernate没有。NHibernate是为一个不太容易学习的新手准备的


    对于您的情况,首先必须检查ORM映射器处理数据库模型的能力,这一点很重要。

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

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


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

    感谢您的指导。你知道为什么它会犹豫使用“数据源”作为关键词吗?我得到一个不受支持的关键字:“数据源”。@William您应该发布连接字符串的代码。如果要我猜的话,我会说这是因为它没有正确逃逸。你是对的。我逃避了“错误!非常感谢”的问题。@AdrianoRepetti感谢你的回答-我对这个问题有一个推论。如果我有相同的模式,但需要在不同的数据库中表示相同的对象(可以访问子客户机中信息的主客户机),是否有一种正确的方法来设置此关系,或者最好将无状态会话或.AsNoQuery()用于实体框架,并将连接作为应用程序的一部分进行管理。
    public class SiteContext : DbContext
    {
        public SiteContext(): base("TheConnectionString")
        {
    
        }
    }