你必须原谅我对EF和/或ORM术语的无知。我熟悉ORM及其目的,但我很难找到是否支持我的用例。
我为不同的客户端提供了独特的数据库,分布在3个数据库服务器上。但是,这些不同数据库的模式是准确的。我的问题是,我怎样才能让EF(或其他.NET orm [NHibernate?])支持这种类型的架构?当我从DB生成模型时,它似乎为该单个数据库创建了一个连接字符串。我需要它来确定在运行时使用的正确连接字符串。
因此,为每个唯一的客户端数据库(不会扩展)保存生成模型,我该怎么办?
感谢您的帮助或指导。
答案 0 :(得分:2)
无法编写一般答案,因为每个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的连接,这是它的连接字符串”。只需将initial catalog
更改为您要连接的数据库即可。
string connectionString = "...";
XpoDefault.DataLayer = XpoDefault.GetDataLayer(
connectionString,
AutoCreateOption.DatabaseAndSchema);
继承ConnectionStrategy
并覆盖Connection
属性。要使用它,您可以设置ConnectionStrategy
对象的ModelUnitOfWork
属性。
继承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时:
在我看来,选择哪种ORM很困难,我现在要输入的内容有点偏颇:
DevExpress ORM XPO。伟大的ORM Mapper,特别是与XAF等产品线一起使用时。他们的支持非常好。
首先使用EF代码非常简单。有传闻称与其他ORM地图制作者相比,它相当缓慢。
Mindscape Lightspeed专注于速度和设计时间功能。非常好的支持。
我参与了使用NHibernate作为ORM映射器的项目。一般意见是它是高度可定制的。我曾参与过那些EF在映射Oracle现有数据库时失败的项目,而NHibernate没有这样做。 NHibernate是一个不容易学习的新手。
对于您的情况,首先必须检查ORM映射器如何处理您的数据库模型。
答案 2 :(得分:0)
我刚刚扩展了我们的系统以支持多租户,其中每个租户都由一个独立的数据库支持。我们的系统使用NHibernate。
我的解决方案很简单:只需继承NHibernate.Connection.DriverConnectionProvider
类,重写GetConnection()
方法即可返回正确的连接。有了这个,您可以使用一个SessionFactory对象来管理具有相同模式的多个数据库。
当然,实施要复杂得多,但它涉及整个系统从单租户到多租户。