ServiceStack OrmLite - 处理默认和计算列

Joh*_*ohn 9 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.
Run Code Online (Sandbox Code Playgroud)

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

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

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

我不知道这是一个错误,还是我错了.

Rob*_*ode 6

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

[Compute, ServiceStack.DataAnnotations.Ignore]
public List<MyModel> MyList {get;set;}
Run Code Online (Sandbox Code Playgroud)

差异似乎是"忽略"属性,它坚持要附加名称空间?? 有了这些,我的基本查询就会运行,否则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
Run Code Online (Sandbox Code Playgroud)

还可以选择使用我没有探索过的ALIAS.


t-c*_*.dk 0

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