我正在使用 NHibernate.JetDriver 将我的实体保存在 Microsoft Access 数据库中。 我有一个名为Employee的简单表,有3列:
这是相应的实体:
class Employee
{
public virtual int Id { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
}
和Mapping(使用 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();
}
}
我的问题如下:员工似乎没有持久存储在数据库中。 我没有例外,保存返回的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 profiler给我的:
-- statement #1
begin transaction with isolation level: Unspecified
-- statement #2
INSERT INTO `Employee`
(FirstName,
LastName)
VALUES (?,
?)
-- statement #3
select @@identity
-- statement #4
commit transaction
答案 0 :(得分:2)
您可能正在查看错误的数据库。在构建过程中,数据库文件将复制到输出文件夹。如果检查输出文件夹中的数据库,则会显示Employee记录。
答案 1 :(得分:1)
如果您下载NHProf的试用版,您应该看到是否正在打开会话,正在启动的事务,正在发送的SQL以及会话是否抛出错误。如果它发出错误,它可能会被某个地方吞没。 NHProf与数据库无关,因此它可以与Jet驱动程序一起使用。
请注意,你得到的是auto number
,所以我不确定,但我确信NHProf会帮助你了解发生了什么。我想知道是不是因为您的birthdate
列是一个字符串而且您的实体属性是dateTime
类型?
通常如果没有行被持久化,那么这表示实体Employee
没有被添加到会话工厂,但是在你的情况下它清楚地表明它是......请注意NHibernate不会抛出例如,如果您尝试保留未映射的实体。