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