首页 文章

Nhibernate在db create script中生成错误

提问于
浏览
1

我正在尝试使用流畅的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

    我现在正在学习NHibernate(阅读NHibernate 3.0 Cookbook),所以我绝不是专家 .

    我目前遇到同样的问题,在SQLite环境中有一个HasMany-map Parent.Children . 这也会导致索引语法错误 .

    从我设法推断出,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)
    )
    

    所以,要么考虑:

    • 指定不是关键字的自定义索引列名,

    • 依靠反引号自动转义(不知道这里发生了什么,没时间检查)
      如果您实际上不需要有序列表,则

    • 使用不同的集合类型 . 见List vs Set vs Bag in NHibernate

相关问题