合成字段上的 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 的回退启发式算法。
这是后续:
.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 的回退启发式算法。