ServiceStack OrmLite - 处理默认和计算列

时间:2012-10-06 15:55:29

标签: c# sql-server servicestack ormlite-servicestack

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属性是否已设置。

我不知道这是一个错误还是我错误地使用它。

2 个答案:

答案 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)

我首先从表中创建一个包含相关列(不包括计算列)的视图,然后从视图中进行操作。这样就可以避免引用不需要的计算列。在插入,删除,更新和大多数其他方面,简单视图的处理方式与普通表的处理方式相同。