我遇到了一个项目问题,其中包括servicestack.ormlite.sqllite32和servicestack.ormlite.postgresql。
使用JoinSqlBuilder时,它根据我的解决方案中安装的nuget包生成不同的SQL。
使用此代码:
var builder = new JoinSqlBuilder<Entities.ServiceInstance, Entities.ServiceInstance>();
builder
.LeftJoin<Entities.ServiceInstance, TokenServicesInstance>(x => x.Id,
x => x.ServiceInstanceId)
.Join<TokenServicesInstance, Token>(x => x.TokenId, x => x.Id,
destinationWhere: t => t.TokenString == masterTokenString);
当调用builder.ToSql()时,我将针对同一个数据库在一个项目中获取postgresql版本:
SELECT“service_instance”。“id”,“service_instance”。“service_name” 来自“service_instance” LEFT OUTER JOIN“token_services_instance”ON“service_instance”。“id”=“token_services_instance”。“service_instance_id”
INNER JOIN“token”ON“token_services_instance”。“token_id”=“token”。“id”
WHERE(“token”。“token_string”='D0441CBF-AC8E-4664-974D-A2F325408AD2')
和另一个项目中的sqllite版本:
SELECT“ServiceInstance”。“Id”,“ServiceInstance”。“ServiceName” 来自“ServiceInstance” LEFT OUTER JOIN“TokenServicesInstance”ON“ServiceInstance”。“Id”=“TokenServicesInstance”。“ServiceInstanceId”
INNER JOIN“Token”ON“TokenServicesInstance”。“TokenId”=“Token”。“Id”
WHERE(“Token”。“TokenString”='D0441CBF-AC8E-4664-974D-A2F325408AD2')
查看此处的代码: JoinSqlBuilder ServiceStack3 source我并不感到惊讶,假设代码版本没有太大变化。
引用带有DialectProvider属性的静态OrmLiteConfig。 调试我的项目,这个属性在它们之间变化。一个是 ServiceStack.OrmLite.PostgreSQL.PostgreSQLDialectProvider 另一个是 ServiceStack.OrmLite.Sqlite.SqliteOrmLiteDialectProvider 。
是的,显然我没有将任何信息传递给joinsql告诉它使用哪种方言,所以也许我应该看到这一个来了。
所以我的问题是
谢谢!
答案 0 :(得分:1)
我在谷歌上发现了这个问题和答案:What's the reasoning behind providing OrmLiteConfig.DialectProvider as a singleton?
引用神话:
OrmLiteConfig.DialectProvider是一个Singleton,因为OrmLite中的所有东西都是一个扩展方法(通过核心ADO.NET接口),所以它需要是静态的。
和
OrmLite并不真正支持同时使用多个不同的数据库提供程序。
在我看到之后,它并没有真正令人惊讶。我想我必须将其中一个处理横切授权的数据库移动到它自己的服务中。