我正在围绕servicestack框架构建一个应用程序,需要能够访问Oracle和MS sql Server中的数据.这是否可能使用ORMLite,似乎我只能为应用程序设置单个方言或者我错过了什么?
解决方法
是的,这是可能的,并且对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