clo*_*ows 6 c# sqlite nhibernate fluent-nhibernate
我有一个组件,我想存储到SQLite数据库.
public class Comp : Entity
{
public virtual DateTime TimeStamp { get; set; }
public virtual String Name { get; set; }
}
public class CompMap : ClassMap<Comp>
{
public CompMap()
{
Id(x => x.Id);
Map(x => x.TimeStamp);
Map(x => x.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
没什么好看的.
问题是TimeStamp错误地存储在DB中(SQLite-Explorer显示值'30 -12-1899')我认为它与nHibernate发送DateTime到数据库的方式有关
NHibernate: INSERT INTO "Comp" (TimeStamp, Name) VALUES (@p0, @p1); select last_insert_rowid(); @p0 = 26.02.2010 10:08:09, @p1 = 'test1'
Run Code Online (Sandbox Code Playgroud)
对我来说,它看起来像是DateTime字符串格式(可能只是.ShowSQL()命令),SQLite无法处理格式(它是德国日期时间格式)我试图改变格式使用IUserType但结果仍然是相同的.
我没有发现其他人有这个问题,所以我假设问题在我的代码中,但我无法找到它.
这是我用来初始化DB并将值插入DB的测试代码
using System;
using System.IO;
using ConsoleApplication1.db;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var sessionFactory = Fluently.Configure().Database(SQLiteConfiguration.Standard.UsingFile("test.db").ShowSql())
.Mappings(m => m.FluentMappings.AddFromAssembly(typeof(Comp).Assembly))
.ExposeConfiguration(config =>
{
if (File.Exists("test.db"))
{
File.Delete("test.db");
}
new SchemaExport(config)
.Create(false, true);
})
.BuildSessionFactory();
var session = sessionFactory.OpenSession();
var ts = DateTime.Now;
Comp c = new Comp
{
Name = "test1",
TimeStamp = ts
};
session.Save(c);
session.Flush();
session.Close();
}
}
}
Run Code Online (Sandbox Code Playgroud)
执行此命令并检查DB内容时,TimeStamp没有当前日期/时间,但是1899-31-12
事实证明,这确实是我的错,而且严重缺乏双重检查。我确实将日期时间写入数据库,然后使用sqlite explorer检查数据库中的值。显然,日期时间字段存在问题并且确实提供了不正确的值。
再加上原来的程序确实有一个错误(日期时间写得不正确)。
我的结论是:不要使用 sqlite explorer
LinqPad确实正确显示了该值,因此从现在开始将被使用。