结合sqlite和postgresql时ServiceStack4 JoinSqlBuilder问题

时间:2014-03-14 14:34:53

标签: servicestack ormlite-servicestack

我遇到了一个项目问题,其中包括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告诉它使用哪种方言,所以也许我应该看到这一个来了。

所以我的问题是

  • 我可以在同一个项目中引用多个OrmLite实现,期望它稳定吗? JoinSqlBuilder是唯一的问题吗?
  • 是否有解决方法以便我可以在项目中使用JoinSqlBuilder?
  • 为什么?为什么ServiceStack采用静态的架构?已经大量使用了扩展函数,这使得编写测试变得更加困难。我应该期待更多的惊喜吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我在谷歌上发现了这个问题和答案:What's the reasoning behind providing OrmLiteConfig.DialectProvider as a singleton?

引用神话:

  

OrmLiteConfig.DialectProvider是一个Singleton,因为OrmLite中的所有东西都是一个扩展方法(通过核心ADO.NET接口),所以它需要是静态的。

  

OrmLite并不真正支持同时使用多个不同的数据库提供程序。

在我看到之后,它并没有真正令人惊讶。我想我必须将其中一个处理横切授权的数据库移动到它自己的服务中。