2016-07-04 50 views
0

我是NHibirnate的新手。 我已經創建了映射文件,模型和那個工作。但現在我試圖使用存儲過程插入,在那裏我使用當前日期,它會引發異常。使用NHibernate和存儲過程的SqlDateTime溢出

我的馬平:

<class name="MyClass" table="table_name"> 
    <id name="Id" column="id"> 
     <generator class="identity"/> 
    </id> 
    <property name="Sum" column="sum"/> 
    <property name="Direction" column="direction"/> 
    <property name="Date" column="datetime"/> 
    <property name="Number" column="number"/> 
    <sql-insert xml:space="preserve"> 
     EXECUTE dbo.pr_AddNew @sum = ?, @direction = ? 
    </sql-insert> 
    </class> 

我的班級:

public class MyClass 
{ 
    public virtual int Id { get; set; } 
    public virtual DateTime Date { get; set; } 
    public virtual decimal Sum { get; set; } 
    public virtual byte Direction { get; set; } 
    public virtual int Number { get; set; } 
} 

而且我的存儲過程:

CREATE PROCEDURE pr_AddNew 
    @sum decimal(19, 2), 
    @direction int 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO dbo.table_name([datetime], sum, direction, number) 
     VALUES(GETDATE(), @sum, @direction, dbo.fn_GetNextNumber()) 
END 
GO 

正如你可以看到我使用GETDATE()函數來獲取在數據庫一側的當天。

這裏是我的測試方法:

[TestMethod] 
    public void AddTest() 
    { 
     var myClass= new MyClass{ Direction=0, Sum=150}; 
     IRepository repository = new MyClassRepository(); 
     repository.Add(myClass); 

     using (ISession session = _sessionFactory.OpenSession()) 
     { 
      var fromDb = session.Get<MyClass>(myClass.Id); 
      Assert.IsNotNull(fromDb); 
      Assert.AreNotSame(myClass, fromDb); 
     } 
    } 

此代碼給了我一個例外: 「SQLDATETIME溢出。」

所以如果我創建MyClass的實例爲:

var myClass= new MyClass{ Direction=0, Sum=150, Date=DateTime.Now()}; 

一切正常。據我所知,問題在於SQL和C#中最小可能的DateTime值之間的差異。但我不需要將datetime值傳遞給sql。 我能做些什麼?

+0

你必須告訴NH'Date'列是自動生成的,否則它會嘗試保存System.DateTime.MinValue,即'0001-01-01'。 –

+0

@PanagiotisKanavos我明白,但我該怎麼做? – Gleb

回答

1

您必須將其映射爲生成的列。它告訴NH不要將它發送到數據庫進行插入或更新,並告訴NH在插入或更新後加載這些值(這可能是一個性能問題)。

generated="never|insert|always" 

你的情況:

​​

順便說一句,有一個完全不同的方法來獲得相同的。您可以在類的構造函數中設置Date並正常映射它。與處理存儲過程相比,它的痛苦程度要低得多。