合成字段上的 ServiceStack AutoQuery 崩溃

ServiceStack AutoQuery crash on synthetic field

这是后续:

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

我正在尝试创建一个 AutoQuery 服务,我可以用一些合成字段(即不是来自数据库的字段)来装饰它。所以我得到了这个带有以下数据传输对象的 AutoQuery 服务:

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\worke4cc16641be8c0\src\ServiceStack.OrmLite\OrmLiteDialectProviderBase.cs:line 1616 at ServiceStack.OrmLite.SqlServer.SqlServerOrmLiteDialectProvider.GetLoadChildrenSubSelect[From](SqlExpression'1 expr) in C:\BuildAgent\worke4cc16641be8c0\src\ServiceStack.OrmLite.SqlServer\SqlServerOrmLiteDialectProvider.cs:line 587 at ServiceStack.OrmLite.Support.LoadList'2..ctor(IDbCommand dbCmd, SqlExpression'1 q) in C:\BuildAgent\worke4cc16641be8c0\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\worke4cc16641be8c0\src\ServiceStack.OrmLite\OrmLiteReadCommandExtensions.cs:line 957 at ServiceStack.OrmLite.OrmLiteExecFilter.Exec[T](IDbConnection dbConn, Func'2 filter) in C:\BuildAgent\worke4cc16641be8c0\src\ServiceStack.OrmLite\OrmLiteExecFilter.cs:line 64 at ServiceStack.TypedQuery'2.Execute[Into](IDbConnection db, ISqlExpression query) in C:\BuildAgent\work81147c480f4a2f\src\ServiceStack.Server\AutoQueryFeature.cs:line 1089

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

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

如果您的模型没有明确的 [PrimaryKey] 属性,它将使用您模型上的第一个 [AutoIncrement][AutoId],如果其中 none 存在的话回退到使用第一个 属性 作为主键,在这种情况下忽略 属性.

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