0

私のモデルには、10 進数型の null 非許容プロパティ Amount を持つエンティティ Order が含まれています。

cf:entity name="Order">
  <cf:property name="Id" />
  <cf:property name="Amount" typeName="decimal" defaultValue="0" nullable="false" />
</cf:entity>

プロパティ Amount の値が 0 のこのエンティティのインスタンスを保存できません。"Order.Save()" を呼び出すと、"プロシージャまたは関数 'Order_Save' は、指定されていないパラメーター '@Amount' を予期しています' というエラーが発生するためです。 ." SQL サーバーから。

ストアド プロシージャでパラメータにデフォルト値 0 を指定すると、すべてうまくいきます: ALTER PROCEDURE [dbo].[Order_Save] ( @Amount [decimal] (28, 13) = 0, ...

Amount パラメータのデフォルト値が 0 のストアド プロシージャを生成するように CodeFluent に指示するにはどうすればよいですか? または、別の解決策を知っていますか?

敬具

4

2 に答える 2

2

設定する必要がありますusePersistenceDefaultValue="false"

<cf:entity name="Order">
  <cf:property name="Id" />
  <cf:property name="Amount" typeName="decimal" nullable="false" usePersistenceDefaultValue="false" />
</cf:entity>

https://www.softfluent.com/documentation/Properties_DefaultValues.html

于 2016-03-03T20:17:06.623 に答える
2

この根本的な原因は、CodeFluent エンティティが修正しようとするオブジェクト リレーショナル インピーダンスの不一致に関連しています。

  • データベース側では、整数型の null 許容列を定義できます (ここでは当てはまりませんが、意味は同じです)。
  • .NET 側では、null にできない整数型を定義します。

これらのワールド間のヌル インピーダンスの不一致を修正するために、CodeFluent Entities は .NET 側で「既定値」の概念を定義します。これはSentinel 値パターンに従います。

このプロパティの .NET 側の「デフォルト値」は、データベース側で null に相当する .NET 値になります。デフォルトでは、この値は数値の場合は 0 (ID 番号の場合は -1) です。

したがって、データベースに 0 を送信することは、null を送信することと同じです。逆に、データベースに null を格納すると、.NET プロパティに 0 が返されます。

ほとんどの ORM とは異なり、CodeFluent Entities は ORM ではありませんが、オブジェクトからリレーショナルへのマッピング テクノロジが含まれています。null許容列を null 許容でない .NET 型にマップするため、エラーや例外は発生しません。魅力的に機能します、このデフォルト値の概念のおかげです。最終的に、null 非許容の .NET 型を null 許容のデータベース列にマップできるため、非常に実用的です。null 許容の int 列を宣言するために使用する必要はありませんint?(ただし、必要に応じて使用できます。CodeFluent Entities はそれをサポートしています)。

あなたの場合、列はnull可能ではないため、.NET 0を送信すると論理的にエラーが発生します.

したがって、「デフォルト値」の概念を使用しないことを選択することも (meziantou の回答のように)、別のデフォルト値を定義することもできます (たとえば、defaultValue="-1" や ID 列の -2 など)。この新しい既定値を .NET から送信すると、引き続きエラーが発生します。

于 2016-03-04T07:17:42.863 に答える