2016-07-04 6 views
0

NHibernateを初めて使用しています。 私はマッピングファイル、モデルを作成しました。しかし、今私は現在の日付を使用している挿入のためのストアドプロシージャを使用しようとしている、それは例外をスローされます。NHibernateとストアドプロシージャを使用したSqlDateTimeのオーバーフロー

マイmaping:

<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()関数を使用しています見ることができるように現在の日にdb側。

[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オーバーフローを"

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

すべてはokです:として

は、だから私は、MyClassのインスタンスを作成する場合。私が理解しているように、問題はSQLとC#のminTime DateTime値の差です。しかし、私は日時の値をSQLに渡す必要はありません。 これで何ができますか?

+0

「Date」列が自動的に生成されることをNHに伝える必要があります。それ以外の場合は、System.DateTime.MinValue、つまり「0001-01-01」を保存しようとします。 –

+0

@PanagiotisKanavos私はそれを理解していますが、どうすればいいですか? – Gleb

答えて

1

生成された列としてマップする必要があります。これは、NHに挿入または更新のためにデータベースにそれを送信しないことをNHに通知し、挿入または更新後に値がロードされることをNHに通知する(これはパフォーマンス上の問題であり得る)。あなたのケースでは

generated="never|insert|always" 

:ところで

​​

、同じを取得するための完全に異なるアプローチがあります。クラスのコンストラクターにDateを設定し、それを通常どおりにマップすることができます。これとは対照的に、ストアドプロシージャに対処するのはずっと苦痛です。

関連する問題