9

ServiceStack OrmLite 究竟如何处理默认列和计算列?

具体来说,我收到了错误

The column "PointsAvailable" cannot be modified because it is either a computed column or is the result of a UNION operator.

此列配置为 SQL Server 2008 数据库中的计算列。

OrmLite 似乎确实对计算列做了一些事情,因为您可以将属性“[ServiceStack.DataAnnotations.Compute]”添加到模型中的属性中。

进入代码,调用“OrmLiteDialetBase.cs”中的函数“ToInsertRowStatement”。当该函数检查是否设置了 AutoIncrement 属性时,它不检查是否设置了 IsComputed 属性。

我不知道这是一个错误还是我只是用错了。

4

2 回答 2

6

对于仅在服务层计算的计算列,SQL 对它们一无所知,因此我在 servicestack 模型上使用了以下属性的组合:

[Compute, ServiceStack.DataAnnotations.Ignore]
public List<MyModel> MyList {get;set;}

不同之处似乎是“忽略”属性坚持附加它的命名空间??。有了这些,我的基本查询就会运行,否则 SQL 会抱怨这些列不存在 - 完全正确!

您可以按照 t-clausen.dk 的建议使用 SQL 过滤器,方法是专门传递带有您想要的所有列名的 SQL CommandText 字符串,但我认为这会引发维护问题。

至于查看数据库的错误修复,似乎 SQL 是通过“toSqlString()”或类似方法在每个提供者的基础上生成的。所以大概有几个地方要注意...

编辑:这只是完成这项工作的 Ignore 属性。从来源:

/// IgnoreAttribute  
/// Use to indicate that a property is not a field  in the table  
/// properties with this attribute are ignored when building sql sentences

还可以选择使用我尚未探索的 ALIAS。

于 2012-11-28T06:55:20.357 回答
0

我建议您使用表中的相关列(不包括计算列)创建一个视图,然后从视图中工作。这样可以避免引用不需要的计算列。在插入、删除、更新和大多数其他方面,简单视图可以像普通表一样对待。

于 2012-10-10T13:29:24.923 回答