通过(Fluent)NHibernate添加到SQLite DB时,DateTime不正确

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过(Fluent)NHibernate添加到SQLite DB时,DateTime不正确相关的知识,希望对你有一定的参考价值。

我有一个组件,我想存储到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);
    }
}

没什么好看的。

问题是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'

对我来说,看起来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();
        }
    }
}

执行此命令并检查DB内容时,TimeStamp没有当前日期/时间,但是1899-31-12

答案

事实证明这确实是我的错,再加上缺乏双重检查。我确实将日期时间写入数据库,然后使用sqlite explorer检查数据库中的值。显然,一个问题与DateTime字段有关,并且显示的值不正确。

那,加上原来的程序确实有一个错误(DateTime没有正确编写)。

我的结论是:不要使用sqlite explorer

LinqPad确实正确显示了该值,因此将从现在开始使用。

另一答案

您是否尝试将当前线程的文化更改为其他内容? InvariantCulture的?如果这会尊重可能导致更有用格式的语言环境?

另一答案

你知道你的TimeStamp在数据库中的类型吗? Sqlite没有特定的DateTime类型,可以将它们存储为text,reals或int。我不知道该怎么做,但是你能否以某种方式将TimeStamp的列类型指定为文本。

如果您在数据库上运行该sql,您会得到什么,即

INSERT INTO“Comp”(TimeStamp,Name)VALUES(26.02.2010 10:08:09,'test1');

如果你运行这个,你会得到什么:

INSERT INTO“Comp”(TimeStamp,Name)VALUES('26 .02.2010 10:08:09','test1');

它可能取决于列定义,以确定后者是否有效。

以上是关于通过(Fluent)NHibernate添加到SQLite DB时,DateTime不正确的主要内容,如果未能解决你的问题,请参考以下文章

Fluent NHibernate - NHibernate.QueryException:无法解析属性

Fluent NHibernate:约定/KeyColumn

使用 Fluent NHibernate 生成表索引

Fluent Nhibernate 映射多重连接

Fluent Nhibernate将集合映射到通用实体

Fluent nHibernate - 如何在联结表上映射非键列?