2016-03-03 33 views
0

我的模型包含了十進制類型的非空的財產金額的實體訂單:不能與值0保存實體不可爲空的數字財產

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

我不能保存的實例這個實體的值爲0,因爲當調用「Order.Save()」時,我得到錯誤「過程或函數'Order_Save'期望參數'@Amount',它沒有提供。」來自SQL-Server。

一切順利如果我給該參數的默認值0,在存儲過程: ALTER PROCEDURE [DBO] [Order_Save] ( @Amount [十進制](28,13)= 0,.. 。 ?

我怎麼能指示CodeFluent生成與金額參數的默認值0存儲過程或你知道另一種解決方案

親切的問候

回答

2

這樣做的根本原因是與Object-relational impedance mismatch該CodeFluent實體嘗試修復。

  • 在數據庫方面,你可以定義一個整型的空列(這是不是這裏的情況,但其意義是相同的)
  • 在.NET方面,定義一個整數類型不能爲空。

要修復這些世界之間的零阻抗不匹配,CodeFluent實體在.NET端定義了一個'默認值'概念。這跟在Sentinel value pattern之後。

該屬性的.NET端「默認值」將是在數據庫端將等於null的.NET值。 默認情況下,該值對於數字爲0(對於標識號爲-1)。

所以,當你發送一個0到數據庫時,它相當於發送一個null。 另一方面,如果你在數據庫中存儲一個空值,你將在.NET屬性中得到一個0。

注意,不同於大多數奧姆斯 - CodeFluent實體是不是一個ORM,但它確實包含對象關係映射技術 - 因爲你映射空列非可空.NET類型,你會不會得到錯誤或異常,它由於這個默認值的概念,我會像魅力一樣工作。這非常實用,因爲最終它允許我們將不可空的.NET類型映射到可爲空的數據庫列。您不必使用int?來聲明可爲null的int列(但如果需要,CodeFluent實體也可以支持它)。

就您而言,由於該列不可爲空,因此如果發送.NET 0,則邏輯上會出錯。因此,您可以選擇不使用「默認值」的概念(如在meziantou的回答中),或者也可以定義另一個默認值(例如defaultValue =「 - 1」,例如,或者-2代表一個身份列),但是如果您從.NET發送此新的默認值,仍然會出現錯誤。

相關問題