合成字段上的ServiceStack自动查询崩溃

时间:2019-03-22 17:57:04

标签: servicestack-autoquery

这是对以下内容的跟踪:https://developer.apple.com/documentation/xcode_release_notes/xcode_10_release_notes#3035624

最新的SS和.Net Core 5.x版本上的.NET Core空Web模板。

我正在尝试创建一个自动查询服务,该服务可以用一些合成字段(即不是来自数据库的字段)修饰。因此,我获得了带有以下数据传输对象的自动查询服务:

public class DataSource {
    [Ignore]
    public string Hello { get { return "Hello there"; }}
    public string DataSourceId { get; set; }    
    public string DataSourceName { get; set; }  
    public int DataSourceSort { get; set; }     
    public bool DataSourceDisabled { get; set; }
    public DateTime LastModified { get; set; }  
}

当我不包括public string Hello时,一切都正常。 该服务本身只是在线服务:

[Route("/query/datasources")]
public class QueryDatasources : QueryDb<DataSource> {}

这是我得到的错误:

  

Offset0Total0Response Status Error CodeInvalidOperationExceptionMessageSequence contains no matching elementStack Trace[QueryDatasources: 22/03/2019 17:47:41]: [REQUEST: {}] System.InvalidOperationException: Sequence contains no matching element at System.Linq.Enumerable.First[TSource](IEnumerable'1 source, Func'2 predicate) at ServiceStack.OrmLite.OrmLiteDialectProviderBase'1.GetLoadChildrenSubSelect[From](SqlExpression'1 expr) in C:\BuildAgent\work\27e4cc16641be8c0\src\ServiceStack.OrmLite\OrmLiteDialectProviderBase.cs:line 1616 at ServiceStack.OrmLite.SqlServer.SqlServerOrmLiteDialectProvider.GetLoadChildrenSubSelect[From](SqlExpression'1 expr) in C:\BuildAgent\work\27e4cc16641be8c0\src\ServiceStack.OrmLite.SqlServer\SqlServerOrmLiteDialectProvider.cs:line 587 at ServiceStack.OrmLite.Support.LoadList'2..ctor(IDbCommand dbCmd, SqlExpression'1 q) in C:\BuildAgent\work\27e4cc16641be8c0\src\ServiceStack.OrmLite\Support\LoadList.cs:line 46 at ServiceStack.OrmLite.OrmLiteReadCommandExtensions.LoadListWithReferences[Into,From](IDbCommand dbCmd, SqlExpression'1 expr, IEnumerable'1 include) in C:\BuildAgent\work\27e4cc16641be8c0\src\ServiceStack.OrmLite\OrmLiteReadCommandExtensions.cs:line 957 at ServiceStack.OrmLite.OrmLiteExecFilter.Exec[T](IDbConnection dbConn, Func'2 filter) in C:\BuildAgent\work\27e4cc16641be8c0\src\ServiceStack.OrmLite\OrmLiteExecFilter.cs:line 64 at ServiceStack.TypedQuery'2.Execute[Into](IDbConnection db, ISqlExpression query) in C:\BuildAgent\work\3481147c480f4a2f\src\ServiceStack.Server\AutoQueryFeature.cs:line 1089

1 个答案:

答案 0 :(得分:1)

问题是因为您的数据模型没有显式的主键。

在OrmLite中,每个模型都必须具有一个主键,按照惯例OrmLite希望将其命名为Id,并且您可以使用[Alias("DbFieldName")]属性将其映射到具有不同名称的列或使用[PrimaryKey]属性,告诉OrmLite为主键使用其他属性。

如果您的模型没有显式的[PrimaryKey]属性,它将使用模型上的第一个[AutoIncrement][AutoId],如果不存在这些属性,则退回到使用第一个属性作为主键,在这种情况下是被忽略的属性。

我已经从this commit中删除了忽略的属性,但是应该明确在哪个字段中用作主键(使用上述任何属性或Id命名约定),而不是依靠OrmLite的后备启发式方法。