1

这是对以下内容的跟进:ServiceStack AutoQuery 合成字段

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

我正在尝试创建一个 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\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

4

1 回答 1

1

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

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

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

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

于 2019-03-22T19:27:09.150 回答