Nhibernate генерирует ошибку в сценарии создания базы данных - PullRequest
1 голос
/ 17 января 2011

Я пытаюсь сгенерировать схему БД с использованием свободно используемых nhibernate, nhibernate 3.0, spring.net 1.3.1 и SQLite. Сценарий создания / обновления, сгенерированный NHibernate:

create table LogEntries (Id UNIQUEIDENTIFIER not null, Hostname TEXT not null, LoggerName TEXT not null, LogLevel INTEGER not null, Message TEXT not null, primary key (Id))
create table Properties (Id INTEGER not null, Key TEXT, Value TEXT, LogEntry_id UNIQUEIDENTIFIER, Index INTEGER, primary key (Id))

Но происходит сбой со следующей ошибкой

System.Data.SQLite.SQLiteException: SQLite error
near "Index": syntax error

Сущности:

public class LogEntry
{
    public virtual Guid Id { get; set; }

    public virtual string LoggerName { get; set; }

    public virtual string Message { get; set; }

    public virtual int LogLevel { get; set; }

    public virtual string Hostname { get; set; }

    public virtual IList<Property> Properties { get; set; }
}

public class Property
{
    public virtual int Id { get; set; }

    public virtual string Key { get; set; }

    public virtual string Value { get; set; }
}

И отображение классов

public class LogEntryMap : ClassMap<LogEntry>
{
    public LogEntryMap()
    {
        Table("LogEntries");
        Id(x => x.Id).GeneratedBy.GuidComb();

        Map(x => x.Hostname).Not.Nullable();
        Map(x => x.LoggerName).Not.Nullable();
        Map(x => x.LogLevel).Not.Nullable();
        Map(x => x.Message).Not.Nullable();

        HasMany(x => x.Properties).Cascade.AllDeleteOrphan().AsList();
    }
}

public class PropertyMap : ClassMap<Property>
{
    public PropertyMap()
    {
        Table("Properties");

        Id(x => x.Id).GeneratedBy.Increment();

        Map(x => x.Key);
        Map(x => x.Value);
    }
}

1 Ответ

3 голосов
/ 21 января 2011

Я в настоящее время изучаю NHibernate самостоятельно (читаю поваренную книгу NHibernate 3.0), поэтому я ни в коем случае не эксперт.

У меня сейчас такая же проблема, когда у меня есть родительская карта HasMany-map.среда SQLite.Это также приводит к ошибке синтаксиса Index.

Из того, что мне удалось вывести, Index является зарезервированным ключевым словом (не так ли почти во всех RDBMS?).Кажется, эти ключевые слова по умолчанию не экранированы, и, следовательно, SQL-скрипт недопустим.

Согласно книге, вы можете избежать имен столбцов, добавив обратный кавычка к имени столбца:

HasMany(x => x.Children).Cascade.AllDeleteOrphan().AsList(p => p.Column("`Index"));

Однако, хотя это «работает», он генерирует следующий SQL-запрос, который, по-видимому, отбросил x:

create table Child (
    Id INTEGER not null,
   ChildType TEXT not null,
   Version INTEGER not null,
   Content TEXT,
   Title TEXT not null,
   Parent_id INTEGER,
   "Inde" INTEGER,
   primary key (Id)
)

Так что, либо рассмотрим:

  • указав пользовательское индексное имя столбца, которое не является ключевым словом,
  • полагается на автоматический переход с обратной косой чертой (не знаю, что здесь происходит, нет времени проверять)
  • использовать другую коллекциювведите, если вам не нужен упорядоченный список.См. Список против Set против Bag в NHibernate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...