Fluent nhibernate 断言失败:“;空标识符";-FluentNH+;SQLServerCE
代码在处失败,断言失败为“空标识符”。我做错了什么Fluent nhibernate 断言失败:“;空标识符";-FluentNH+;SQLServerCE,fluent-nhibernate,sql-server-ce,Fluent Nhibernate,Sql Server Ce,代码在处失败,断言失败为“空标识符”。我做错了什么 session.Save(employee); using FluentNHibernate.Cfg; using FluentNHibernate.Cfg.Db; using FluentNHibernate.Mapping; using NHibernate; using NHibernate.Cfg; using NHibernate.Tool.hbm2ddl; namespace FNHTest { public class
session.Save(employee);
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using FluentNHibernate.Mapping;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
namespace FNHTest
{
public class Employee
{
public virtual int Id
{
get;
private set;
}
public virtual string Name
{
get;
set;
}
public virtual string Surname
{
get;
set;
}
}
public class EmployeeMap : ClassMap
{
public EmployeeMap()
{
Id(e => e.Id);
Map(e => e.Name);
Map(e => e.Surname);
}
}
public class DB
{
private static ISessionFactory mySessionFactory = null;
private static ISessionFactory SessionFactory
{
get
{
if (mySessionFactory == null)
{
mySessionFactory = Fluently.Configure()
.Database(MsSqlCeConfiguration.Standard
.ConnectionString("Data Source=MyDB.sdf"))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf())
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
}
return mySessionFactory;
}
}
private static void BuildSchema(Configuration configuration)
{
SchemaExport schemaExport = new SchemaExport(configuration);
schemaExport.Execute(false, true, false);
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
public class Program
{
public static void Main(string[] args)
{
var employee = new Employee
{
Name = "John",
Surname = "Smith"
};
using (ISession session = DB.OpenSession())
{
session.Save(employee);
}
}
}
}
将NHibernate与SQL CE标识列一起使用时存在一个“bug”。我知道有两种变通方法:
1-设置连接。在配置中,在关闭时将\u mode
属性释放为:
mySessionFactory = Fluently.Configure()
.Database(MsSqlCeConfiguration.Standard
.ConnectionString("Data Source=MyDB.sdf"))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf())
.ExposeConfiguration(BuildSchema)
.ExposeConfiguration(x => x.SetProperty("connection.release_mode", "on_close"))
.BuildSessionFactory();
2-在事务中执行插入:
using (ISession session = DB.OpenSession())
using (ITransaction txn = session.BeginTransaction())
{
session.Save(employee);
txn.Commit();
}
我知道这个问题已经问了一个多月了,但我希望这个答案对你仍然有用。仍然是正确的。即使第一次调用SELECT@@IDENTITY也会返回corect值,但第二次调用返回null
我用
*connection.driver\u class=NHibernate.driver.SqlServerCeDriver
方言:NHibernate.dial.MsSqlCeDialect*
添加属性后
*connection.release\u模式:打开\u关闭*
对于我的NHIbernate配置,它工作起来只是出于兴趣-解决方案是什么,选项1或2(或其他)?:-)我也有同样的问题。当我使用选项1时,insert非常有效,但update根本不起作用。当我使用选项2时,insert和update都会按预期工作,但执行时间要慢2倍。无论如何,在使用NHibernate时,最好总是将所有数据库交互包装在一个事务中。所以我只会推荐选项2。只是出于兴趣-解决方案是什么,选项1或2(或其他)?:-)