2012-10-06 14 views
9

ServiceStack OrmLiteはデフォルト列と計算列をどのように処理しますか? 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プロパティが設定されているかどうかはチェックしていません。

これはバグか、私が間違って使っているのか分かりません。

+0

私はIsComputedのチェックを追加しようとします。問題が修正された場合は、githubでバグ修正を含むプルリクエストを作成します。 ServiceStackはうまく設計されたプログラムなので、このチェックが行われる場所は複数ありません。 – theMayer

+0

私の前のコメントを明確にするために、ソースコードでこれを行い、バイナリを再コンパイルします。約5分以上かかるべきではありません。 – theMayer

答えて

0

私は、テーブルから関連する列(計算された列を除く)を含むビューを作成し、その代わりにビューから作業します。これにより、不要な計算列への参照を避けることができます。単純なビューは、挿入、削除、更新、およびその他のほとんどの側面に関して、通常の表と同じ方法で扱うことができます。唯一のサービス層で計算されている私の計算列の場合

+0

それはちょっと...ハッキーです。 ServiceStackに組み込みの方法があることを期待していました。 – John

+0

@johnあなたは現在、ServiceStack OrmLiteで何らかのバグが起きているようです。私はあなたのツールを修正することができないので、回避策が第2のベストでなければなりません。これは回避策への私の手術です。それ以外の場合はOrmLiteを作った人に連絡して修正を依頼することができます。 –

6

、SQLはそれらについて何も知らないので、私はservicestackモデルで、次の属性の組み合わせを使用:

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

違いがあると思われます名前空間が添付されていることを主張していた "Ignore"属性?これらを使用すると、私の基本クエリが実行されます。そうでなければ、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を使用するオプションもあります。