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]'到模型中的属性。
进入代码,功能' ToInsertRowStatement'在&ormLiteDialetBase.cs' OrmLiteDialetBase.cs'叫做。当该函数检查是否设置了AutoIncrement属性时,它不会检查IsComputed属性是否已设置。
我不知道这是一个错误还是我错误地使用它。
答案 0 :(得分:6)
对于仅在服务层中计算的计算列,SQL对它们一无所知,因此我在servicestack模型上使用了以下属性的组合:
[Compute, ServiceStack.DataAnnotations.Ignore]
public List<MyModel> MyList {get;set;}
差异似乎是“忽略”属性,它坚持要附加名称空间??有了这些,我的基本查询就会运行,否则SQL会抱怨列不存在 - 这足够了!
你可以按照t-clausen.dk的建议,通过专门传递一个带有你想要的所有列名的SQL CommandText字符串来使用SQL过滤器,但我认为这会打开一个维护问题。
对于查看数据库的错误修正,看起来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。
答案 1 :(得分:0)
我首先从表中创建一个包含相关列(不包括计算列)的视图,然后从视图中进行操作。这样就可以避免引用不需要的计算列。在插入,删除,更新和大多数其他方面,简单视图的处理方式与普通表的处理方式相同。