使用Service.Db.Exists的ServiceStack <poco>(对象)与OrmLite.SqlServer </poco>一起使用时抛出异常

时间:2014-03-14 22:06:23

标签: ormlite-servicestack servicestack-bsd

我期望Exists<>()函数将检查数据库中是否存在数据:

if (!Service.Db.Exists<Poco.ApplicationObject>(applicationObject))
{
    Service.Db.Insert(applicationObject);
} 

但运行此代码时我得到System.NotImplementedException

OrmLiteReadExtensions.cs中:

private static bool HasChildren<T>(this IDbCommand dbCmd, object record, string sqlFilter, params object[] filterParams)
{
  string str = OrmLiteConfig.DialectProvider.ToExistStatement(typeof (T), record, sqlFilter, filterParams);
  dbCmd.CommandText = str;
  return dbCmd.ExecuteScalar() != null;
}

是否在ServiceStack.OrmLite.SqlServer

中实施

1 个答案:

答案 0 :(得分:1)

OrmLite.SqlServer方言中没有实现ToExistStatement方法,但这可能是因为T-SQL Exists method applies to subqueries而不是以你想要的方式检查记录的存在,这是为了避免混淆。

如果您read the dialect provider,则无法找到ToExistStatement方法。

有效地,您正在寻找一种方法:

  

SELECT TOP 1 id FROM applicationObjects WHERE id =?;

您可以编写ToExists方法来创建SELECT TOP 1 SQL以获得此功能。您需要创建自定义SqlServerOrmLiteDialect并告诉您的连接使用它。

public class MyCustomSqlServerOrmLiteDialectProvider : SqlServerOrmLiteDialectProvider
{
    public static new MyCustomSqlServerOrmLiteDialectProvider Instance = new MyCustomSqlServerOrmLiteDialectProvider();

    public override string ToExistStatement(Type fromTableType, object objWithProperties, string sqlFilter, params object[] filterParams)
    {
        // return "SELECT TOP 1 ..."
        throw new NotImplementedException();
    }
}