2

我正在使用NHibernate.JetDriver将我的实体保存在Microsoft Access数据库中。我有一个名为 Employee 的简单表,包含 3 列:

  • ID(自动生成的号码)
  • 名字(文字)
  • 姓氏(文本)

这是相应的实体:

class Employee
{
    public virtual int Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
}

和映射(使用Fluent NHibernate):

class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        Id(x => x.Id)
            .GeneratedBy.Native();
        Map(x => x.FirstName);
        Map(x => x.LastName);
    }
}

然后我有以下代码来配置 SessionFactory (使用Fluent NHibernate),创建一个新的Employee并将其保存到数据库中:

var sessionFactory = Fluently.Configure()
    .Database(JetDriverConfiguration.Standard
        .ConnectionString(@"Provider=Microsoft.ACE.OLEDB.12.0;
            Data Source=.\Company.accdb")
        .ShowSql)
    .Mappings(m => m.FluentMappings
        .AddFromAssemblyOf<EmployeeMap>())
    .BuildSessionFactory();

var employee = new Employee
{
    FirstName = "Laurent",
    LastName = "De Cant"
};

using (var session = sessionFactory.OpenSession())
{
    using (var transaction = session.BeginTransaction())
    {
        var id = session.Save(employee);
        transaction.Commit();
    }
}

我的问题如下:员工似乎没有保留在数据库中。我也不例外,Save返回的 id是正确的。一切似乎都很好,除了当我检查表中的数据时,没有员工......

使用 ShowSql 选项,这里是生成的 SQL:

NHibernate: INSERT INTO `Employee` (FirstName, LastName) VALUES (?, ?);
@p0 = 'Laurent' [Type: String (7)], @p1 = 'De Cant' [Type: String (7)]
NHibernate: select @@identity

这是 NHibernate 分析器给我的:

-- statement #1
begin transaction with isolation level: Unspecified

-- statement #2
INSERT INTO `Employee`
            (FirstName,
             LastName)
VALUES      (?,
             ?)

-- statement #3
select @@identity

-- statement #4
commit transaction
4

2 回答 2

2

您可能正在查看错误的数据库。在构建过程中,数据库文件被复制到输出文件夹。如果您检查输出文件夹中的数据库,将显示员工记录。

于 2013-09-28T12:38:20.437 回答
1

如果您下载NProf试用版,您应该查看会话是否正在打开、事务是否正在启动、正在发送的 SQL 以及会话是否抛出错误。如果它抛出错误,它可能会在某个地方被吞没。NHProf 是独立于数据库的,因此它可以与 Jet 驱动程序一起使用。

请注意,您正在获得auto number支持,所以我不确定,但我相信 NHProf 会帮助您了解正在发生的事情。我想知道是不是因为你的birthdate列是一个字符串,而你在实体上的属性是一个dateTime类型?

通常如果没有行被持久化,那么这表明实体Employee没有被添加到会话工厂,但是在你的情况下它清楚地表明它是......请注意,如果你尝试持久化未映射的 NHibernate 不会抛出异常实体。

于 2013-09-28T05:45:49.620 回答