2010-03-02 12 views
14

Il codice non riesce a AssertionFailure: "identificativo nullo" - FluentNH + SQLServerCE

session.Save(employee);
con "identificatore nullo" AssertionFailure. Che cosa sto facendo di sbagliato?

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); 
      } 
     } 
    } 
}
+0

ust out of interest - qual era la soluzione, opzione 1 o 2 (o un'altra)? :-) –

risposta

28

C'è un "bug" quando si utilizza NHibernate con colonne Identity SQL CE. Ci sono due soluzioni, che io sappia:

1 - Impostare la proprietà connection.release_mode-on_close in configurazione:

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 - Eseguire inserti in una transazione:

using (ISession session = DB.OpenSession()) 
    using (ITransaction txn = session.BeginTransaction()) 
    { 
     session.Save(employee); 
     txn.Commit(); 
    } 

mi rendo conto la questione ha più di un mese, ma spero che questa risposta ti sia ancora utile.

+0

Trovato la soluzione in precedenza. Comunque, grazie per la risposta! – Stefan

+0

Appena fuori interesse: qual era la soluzione, opzione 1 o 2 (o un'altra)? :-) –

+0

Ho usato le transazioni. – Stefan

1

È ancora il vero. Anche prima chiamata a SELECT @@ IDENTITY restituisce il valore corect, ma pochi secondi restituisce null

Io uso

* connection.driver_class = NHibernate.Driver.SqlServerCeDriver dialetto: NHibernate.Dialect.MsSqlCeDialect *

Dopo aggiungendo la proprietà * connection.release_mode: on_close * alla mia configurazione NHIbernate funziona

Problemi correlati