Не удается сохранить объект со значением 0 для числового свойства, не допускающего значения NULL

Моя модель содержит сущность Order с ненулевым свойством. Количество типа decimal:

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

Я не могу сохранить экземпляр этой сущности со значением 0 для свойства Amount, потому что при вызове "Order.Save()" Я получаю ошибку "Процедура или функция" Order_Save "ожидает параметр" @Amount ", который не был предоставлен ". с SQL-сервера.

Все идет хорошо, если я задаю для параметра значение по умолчанию 0 в хранимой процедуре: ALTER PROCEDURE [dbo].[Order_Save] ( @Amount [decimal] (28, 13) = 0, ...

Как я могу дать команду CodeFluent сгенерировать хранимую процедуру со значением по умолчанию 0 для параметра Amount? Или вы знаете другое решение?

С уважением

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

Основная причина этого связана с несоответствием объектно-реляционного импеданса, которое CodeFluent Entities пытается исправить.

  • На стороне базы данных вы можете определить обнуляемый столбец для целочисленного типа (здесь это не так, но последствия те же)
  • На стороне.NET вы определяете интегральный тип, который не может быть нулевым.

Чтобы устранить несоответствие нулевого импеданса между этими мирами, CodeFluent Entities определяет концепцию "значения по умолчанию" на стороне.NET. Это следует за шаблоном стоимости Sentinel.

"Значение по умолчанию" на стороне.NET для этого свойства будет значением.NET, которое будет равно нулю на стороне базы данных. По умолчанию это значение равно 0 для номера (и -1 для идентификационного номера).

Таким образом, когда вы отправляете 0 в базу данных, это эквивалентно отправке нулевого значения. С другой стороны, если вы храните ноль в базе данных, вы получите 0 в свойстве.NET.

Обратите внимание, что в отличие от большинства ORM - CodeFluent Entities не является ORM, но содержит технологию сопоставления объектов и реляций - вы не получите ошибку или исключение, поскольку вы сопоставляете обнуляемый столбец с необнуляемыми типами.NET, он будет работать как шарм, благодаря этой концепции значения по умолчанию. Это очень практично, потому что, в конце концов, это позволяет нам отображать ненулевые типы.NET в пустые столбцы базы данных. Вам не нужно использовать int? объявить обнуляемый столбец int (но вы можете, если хотите, CodeFluent Entities его поддерживает).

В вашем случае, поскольку столбец не обнуляем, вы логически получаете сообщение об ошибке, если отправляете.NET 0.

Таким образом, вы можете не использовать концепцию "значение по умолчанию" (как в ответе meziantou), а также вы можете определить другое значение по умолчанию (например, defaultValue="-1" или -2 для столбца идентификаторов), но вы все равно получите ошибку, если отправите это новое значение по умолчанию из.NET.

Другие вопросы по тегам