【问题标题】:ServiceStack OrmLite - Handling Default and Computed columnsServiceStack OrmLite - 处理默认列和计算列
【发布时间】:2012-09-27 11:56:37
【问题描述】:

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 属性。

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

【问题讨论】:

  • 我会尝试为 IsComputed 添加检查。如果这解决了问题,请在 github 上创建一个带有错误修复的拉取请求。 ServiceStack 是一个架构完善的程序,因此不太可能在多个地方进行此检查。
  • 为了澄清我之前的评论,您可以在源代码中执行此操作,然后重新编译二进制文件。不应该超过 5 分钟。

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


【解决方案1】:

对于只在服务层计算的计算列,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

还有一个选项可以使用我没有探索过的别名。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这有点... hacky。我希望 ServiceStack 中有一些内置的方法可以做到这一点。
    • @john 看来您目前在 ServiceStack OrmLite 中遇到了某种错误。由于我无法修复您的工具,因此解决方法应该是第二好的解决方法,这是我对解决方法的建议。否则,您可以联系制作 OrmLite 的人并请求修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多