代码之家  ›  专栏  ›  技术社区  ›  Velocoder

保存对象时sqlite“无此表”

  •  5
  • Velocoder  · 技术社区  · 15 年前

    我尝试将对象插入sqlite inmembory数据库,如下所示:

    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();
        }
    

    但我发现了错误: "SQLite error\r\nno such table: Person" 只是澄清一下:我使用InMemory选项。

    我还使用了FluentHibernate和Mapping:

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

    我做错什么了?事先谢谢。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Darin Dimitrov    15 年前

    您需要在发送任何请求之前创建表结构。一种方法是使用 NHibernate.Tool.hbm2ddl.SchemaExport . 你可以看看 this example . 另一种方法是手动操作,即 CREATE TABLE Person ... . 当然,它的优势在于 SchemaExport 如果修改映射,它将自动反映生成的数据库架构。

        2
  •  20
  •   ktutnik    14 年前

    我知道这是一个古老的职位,

    我也面临同样的问题,实际上我写的是模式导出。但例外是直到出现。

    问题是您需要使用打开的会话来执行架构导出。所以您需要修改您的配置。

    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();
    

    一旦你通过 OpenSession() 用它来喂你 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);
    

    我希望它能帮助其他面临同样问题的人。

    注释

    我用了NHibernate 2.1.2,Fluent NHibernate 1.1和.NET 3.5

        3
  •  4
  •   Mark Simpson    15 年前

    正如DarinDimitrov所说,您需要导出模式。幸运的是,有一个很好的方法可以使用fluent nh:)

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

    …其中buildschema是一个方法:

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

    来源: http://wiki.fluentnhibernate.org/Schema_generation