0

我的模型包含一个具有不可为空属性的实体 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, ...

如何指示 CodeFluent 为 Amount 参数生成默认值为 0 的存储过程?或者你知道另一种解决方案吗?

亲切的问候

4

2 回答 2

2

其根本原因与CodeFluent Entities 试图修复的对象关系阻抗不匹配有关。

  • 在数据库方面,您可以为整数类型定义一个可为空的列(这里不是这种情况,但含义是相同的)
  • 在 .NET 方面,您定义了一个不能为空的整数类型。

为了修复这些世界之间的零阻抗不匹配,CodeFluent 实体在 .NET 端定义了一个“默认值”概念。这遵循哨兵价值模式

此属性的 .NET 端“默认值”将是在数据库端等效于 null 的 .NET 值。默认情况下,对于数字,此值为 0(对于标识号,该值为 -1)。

因此,当您向数据库发送 0 时,就相当于发送了一个空值。另一方面,如果您在数据库中存储一个空值,您将在 .NET 属性中得到一个 0。

请注意,与大多数 ORM 不同 - CodeFluent Entities 不是 ORM,但它确实包含对象到关系映射技术 - 您不会收到错误或异常,因为您将可为空的列映射到不可为空的 .NET 类型,它会像魅力一样工作,多亏了这个默认值概念。它非常实用,因为最后,它允许我们将不可为空的 .NET 类型映射到可空的数据库列。您不必使用int?来声明可为空的 int 列(但如果您愿意,也可以,CodeFluent Entities 支持它)。

在您的情况下,由于该列不可为空,因此如果您发送 .NET 0,逻辑上会出现错误。

因此,您可以选择不使用“默认值”概念(例如在 meziantou 的答案中),或者您也可以定义另一个默认值(例如 defaultValue="-1" 或 -2 用于标识列),但是如果您从 .NET 发送这个新的默认值,您仍然会收到错误消息。

于 2016-03-04T07:17:42.863 回答
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 回答