AssertionFailure: "null identifier" - FluentNH + SQLServerCE
Код не работает с
session.Save(employee);
с идентификатором "Идентификатор" AssertionFailure. Что я делаю неправильно?
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);
}
}
}
}
Ответы
Ответ 1
Там есть "ошибка" при использовании NHibernate с столбцами идентификации SQL CE. Я знаю о двух обходных решениях:
1 - установите для свойства connection.release_mode
значение on_close
в конфигурации:
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();
}
Я понимаю, что вопрос больше месяца, но я надеюсь, что этот ответ по-прежнему будет вам полезен.
Ответ 2
Является ли все еще истинным. Даже первый вызов SELECT @@IDENTITY возвращает значение corect, но секунды возвращает null
Я использую
* connection.driver_class= NHibernate.Driver.SqlServerCeDriver
диалект: NHibernate.Dialect.MsSqlCeDialect *
После добавления свойства
* connection.release_mode: on_close *
к моей конфигурации NHIbernate она работает