我的模型包含一个具有非可空属性的实体Order数量为decimal的数量:
cf:entity name="Order">
<cf:property name="Id" />
<cf:property name="Amount" typeName="decimal" defaultValue="0" nullable="false" />
</cf:entity>
我无法使用属性Amount的值0保存此实体的实例,因为在调用&#34; Order.Save()&#34;我收到了错误&#34;程序或功能&#39; Order_Save&#39;期望参数&#39; @ Amount&#39;,这是未提供的。&#34;来自SQL-Server。
如果我在存储过程中为参数提供默认值0,那么一切顺利: ALTER PROCEDURE [dbo]。[Order_Save] ( @Amount [decimal](28,13)= 0, ...
如何指示CodeFluent生成Amount参数的默认值为0的存储过程?或者您知道另一种解决方案吗?
亲切的问候
答案 0 :(得分: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
答案 1 :(得分:2)
其根本原因与CodeFluent实体尝试修复的Object-relational impedance mismatch有关。
为了解决这些世界之间的空阻抗不匹配问题,CodeFluent实体定义了一个默认值&#39; .NET方面的概念。这遵循Sentinel value pattern。
.NET端&#39;默认值&#39;对于此属性,.NET将在数据库端等效于null。 默认情况下,对于数字,此值为0(对于标识号,该值为-1)。
因此,当您向数据库发送0时,它相当于发送空值。 另一方面,如果在数据库中存储null,则在.NET属性中得到0。
请注意,与大多数ORM不同 - CodeFluent实体不是ORM,但它确实包含对象到关系映射技术 - 您将不获取错误或异常,因为您将可空列映射到非可空。 NET类型,由于这个默认值概念,它将像魅力一样工作。它非常实用,因为它最终允许我们将不可为空的.NET类型映射到可以为空的数据库列。您不必使用int?
来声明可以为空的int列(但如果您愿意,可以使用CodeFluent实体支持它)。
在您的情况下,由于列不可为空,因此如果发送.NET 0,则逻辑上会出错。
因此,您可以选择不使用&#39;默认值&#39;概念(比如在meziantou的答案中),或者您也可以定义另一个默认值(例如defaultValue =&#34; -1&#34;例如,或-2为标识列),但是您可以如果从.NET发送这个新的默认值,仍会出现错误。