AssertionFailure: “null identifier” - FluentNH + SQLServerCE
The code fails at
session.Save(employee);with AssertionFailure "null identifier". What am I doing wrong?
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); } } } }
Answers
There's a "bug" when using NHibernate with SQL CE identity columns. There are two workarounds that I know of:
1 - Set the connection.release_mode property to on_close in configuration:
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 - Perform inserts in a transaction:
using (ISession session = DB.OpenSession()) using (ITransaction txn = session.BeginTransaction()) { session.Save(employee); txn.Commit(); }
I realize the question is more than a month old but I hope this answer is still of use to you.
Is is still the true. Even first call to SELECT @@IDENTITY returns corect value, but seconds returns null
I use
*connection.driver_class = NHibernate.Driver.SqlServerCeDriver dialect: NHibernate.Dialect.MsSqlCeDialect*
After adding property *connection.release_mode: on_close* to my NHIbernate configuration it works