具有多个数据库服务器的ServiceStack OrmLite

时间:2012-12-03 20:58:41

标签: sql-server oracle11g ormlite-servicestack

我正在围绕servicestack框架构建一个应用程序,并且需要能够访问Oracle和MS Sql Server中的数据。这可能是使用ORMLite,似乎我只能为App设置一个方言或者我错过了什么?

1 个答案:

答案 0 :(得分:15)

是的,有可能并且OrmLiteConnectionFactory已经内置了对此的支持,请参阅Master SQLServer + Sqlite shard example on OrmLite's project home page

基本上,您首先要注册默认(或主要)连接:

var dbFactory = new OrmLiteConnectionFactory(
  "Data Source=host;Initial Catalog=RobotsMaster;Integrated Security=SSPI", 
  SqlServerDialect.Provider); 

然后,您将为您希望支持的每个其他连接注册命名连接,例如:

dbFactory.RegisterConnection("shard-1", 
  "~/App_Data/{0}.sqlite".Fmt(shardId).MapAbsolutePath(),
    SqliteDialect.Provider);

配置完成后,打开连接而不指定名称将打开与默认数据库的连接,例如:

using (IDbConnection db = dbFactory.OpenDbConnection()) { ... } //Default DB

虽然您可以指定一个名称来打开与具有不同提供者的数据库的命名连接,例如:

using (var dbShard = dbFactory.OpenDbConnection("shard-1")) { ... } //Named DB

手动使用不同的方言提供者

每个方言提供程序中包含不同RDBMS之间的SQL Provider实现之间的差异。因此,如果您想对特定的ADO.NET提供程序实现使用OrmLite的便捷扩展方法,您只需要分配您希望使用的ThreadStatic DialectProvider,例如:

OrmLiteConfig.DialectProvider = SqlServerDialect.Provider;
var dbConn = new SqlConnection(SqlServerConnString);
dbConn.Select<Table>(); //All db access now uses the above dialect provider

这基本上就是OrmLiteConnectionFactory中RegisterConnection自动在幕后为你做的事情。

此处参考OrmLite的所有方言提供者到目前为止:

  • SqlServerDialect.Provider
  • SqliteDialect.Provider(不同的32/64和Mono impls可用)
  • MySqlDialect.Provider
  • PostgreSqlDialect.Provider
  • OracleDialect.Provider
  • FirebirdDialect.Provider