9

ServiceStack OrmLiteはデフォルトの列と計算された列をどの程度正確に処理していますか?

具体的にはエラーが発生します

The column "PointsAvailable" cannot be modified because it is either a computed column or is the result of a UNION operator.

この列は、SQLServer2008データベースの計算列として構成されます。

OrmLiteは、属性'[ServiceStack.DataAnnotations.Compute]'をモデルのプロパティに追加できるため、計算列に対して何かを行うようです。

コードにステップインすると、「OrmLiteDialetBase.cs」の関数「ToInsertRowStatement」が呼び出されます。この関数は、AutoIncrementプロパティが設定されているかどうかをチェックしていますが、IsComputedプロパティが設定されているかどうかはチェックしていません。

これがバグなのか、間違って使用しているだけなのかわかりません。

4

2 に答える 2

6

サービス層でのみ計算される私の計算列については、SQL はそれらについて何も知らないので、サービススタック モデルで次の属性の組み合わせを使用しました。

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

違いは、名前空間を添付することを主張した「無視」属性のようです??。これらを配置すると、私の基本的なクエリが実行されます。それ以外の場合、SQL は列が存在しないと不平を言います-当然のことです!

t-clausen.dk で提案されているように、必要なすべての列名を含む SQL CommandText 文字列を具体的に渡すことで SQL フィルターを使用できますが、メンテナンスの問題が発生すると思います。

データベースを確認するバグ修正に関しては、"toSqlString()" または同様のメソッドによって SQL がプロバイダーごとに生成されるようです。というわけで、気をつけたいポイントがいくつかありますが…

編集: 仕事をするのは単に無視属性です。ソースから:

/// 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 を使用するオプションもあります。

于 2012-11-28T06:55:20.357 に答える
0

テーブルから関連する列(計算列を除く)を使用してビューを作成し、代わりにビューから作業することをお勧めします。このようにして、不要な計算列への参照を回避します。単純なビューは、挿入、削除、更新、およびその他のほとんどの側面に関して、通常のテーブルと同じように扱うことができます。

于 2012-10-10T13:29:24.923 に答える