Sqlite "Нет такой таблицы" при сохранении объекта - PullRequest
5 голосов
/ 19 января 2010

Я пытаюсь вставить объект в базу данных 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.

Ятакже используя FluentNhibernate с отображением:

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 ]

20 голосов
/ 22 августа 2010

Я знаю, что это старый пост,

Я столкнулся с той же проблемой, на самом деле я написал экспорт схемы точно. Но исключение пока не появится.

Проблема в том, что вам нужно использовать открытый сеанс для выполнения экспорта схемы. Поэтому вам нужно изменить свою конфигурацию.

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

4 голосов
/ 20 января 2010

Как сказал Дарин Димитров, вам нужно экспортировать схему. К счастью, есть хороший способ сделать это, используя 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

4 голосов
/ 20 января 2010

Вам необходимо создать структуры таблиц перед отправкой любых запросов.Один из способов сделать это - использовать NHibernate.Tool.hbm2ddl.SchemaExport.Вы можете взглянуть на этот пример .Другой способ - сделать это вручную, т.е. CREATE TABLE Person ....Конечно, преимущество SchemaExport состоит в том, что если вы измените свои отображения, он автоматически отразится на сгенерированной схеме базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...