2010-01-19 12 views
5

Im tratando de insertar objetos en la base de datos SQLite InMembory de la siguiente manera:SQLite "No existe tal mesa" al guardar objetos

private void button1_Click(object sender, EventArgs e) 
    { 
     var sessionFactory = CreateSessionFactory(); 
     using (var session = sessionFactory.OpenSession()) 
     { 
      Person p = new Person { Age = 25, FirstName = "Dariusz", LastName = "Smith" }; 
      session.SaveOrUpdate(p); 
      //transaction.Commit(); 
     } 
    } 

private static ISessionFactory CreateSessionFactory() 
    { 
     return Fluently.Configure() 
     .Database(
     SQLiteConfiguration.Standard.InMemory().ShowSql()) 

     .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Person>()) 
     .BuildSessionFactory(); 
    } 

Pero Im que consigue ERROR: "SQLite error\r\nno such table: Person" Sólo una aclaración: Im utilizando la opción InMemory.

También estoy usando FluentNhibernate con el mapeo:

public class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     //Table("Person") doesn't resolve my problem 
     Id(x => x.Id); 
     Map(x => x.FirstName); 
     Map(x => x.LastName); 
     Map(x => x.Age); 
    } 
} 

¿Qué estoy haciendo mal? Gracias por adelantado.

Respuesta

4

Debe crear las estructuras de la tabla antes de enviar cualquier solicitud. Una forma de hacerlo es usar NHibernate.Tool.hbm2ddl.SchemaExport. Puede echar un vistazo al this example. Otra forma es hacerlo manualmente, es decir, CREATE TABLE Person .... Por supuesto, la ventaja de SchemaExport es que si modifica sus asignaciones, se reflejará automáticamente en el esquema de la base de datos generado.

+1

+1 sí ver NHibernate.Tool.hbm2ddl.SchemaExport – dotjoe

4

Como dijo Darin Dimitrov, debe exportar el esquema. Por suerte, hay una buena manera de hacerlo utilizando Fluido NH :)

return Fluently.Configure() 
    .Database(SQLiteConfiguration.Standard.InMemory().ShowSql()) 
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Person>()) 
    .ExposeConfiguration(BuildSchema) 
    .BuildSessionFactory(); 

... donde BuildSchema es un método:

private void BuildSchema(Configuration cfg) 
{ 
    new SchemaExport(cfg) 
    .Create(false, true); 
} 

Fuente: http://wiki.fluentnhibernate.org/Schema_generation

+0

Gracias voy a mirar esto cuando estoy en casa y voy a responder. – Dariusz

+0

'SchemaExport.Create' no permite que la sesión se vacíe (' .Flush() '). 'SchemaExport.Execute' es por lo tanto la mejor opción en esta instancia por cada respuesta de ktutnik. – Neo

19

Sé que es un viejo post,

Me enfrenté al mismo problema, en realidad escribí el esquema de exportación exactamente. Pero la excepción es hasta que aparezca.

El problema es que necesita usar la sesión abierta para ejecutar la exportación del esquema. Entonces necesitas modificar tu configuración.

ISessionFactory session = Fluently.Configure() 
    .Database(SQLiteConfiguration.Standard.InMemory()) 
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<MessagingDescriptorMap>()) 

    .ExposeConfiguration(c => 
    { 
     config = c; //pass configuration to class scoped variable 
    }) 
    .BuildSessionFactory(); 

una vez que realice la sesión por OpenSession() uso que alimentar a su SchemaExport.Execute

ISession session = GetSessionFactory().OpenSession(); 
//the key point is pass your session.Connection here 
new SchemaExport(config).Execute(true, true, false, session.Connection, null); 

espero vez pueda ayudar a otro cuerpo que se enfrentan al mismo problema.

Nota

I Used NHibernate 2.1.2, Fluido NHibernate 1.1 y 3.5 de .NET

+0

¡Gracias, esto me acaba de ahorrar un montón de dolor! –

+0

+1. Gracias, me salvaste de un dolor de cabeza más. – Llyle

+0

+1. ¡Fantástico! Gracias por documentar esto. –

Cuestiones relacionadas