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。 我能做些什么?
你必须告诉NH'Date'列是自动生成的,否则它会尝试保存System.DateTime.MinValue,即'0001-01-01'。 –
@PanagiotisKanavos我明白,但我该怎么做? – Gleb