C# Nhibernate在db create脚本中生成错误

C# Nhibernate在db create脚本中生成错误,c#,nhibernate,fluent-nhibernate,sqlite,C#,Nhibernate,Fluent Nhibernate,Sqlite,我正在尝试使用fluent nhibernate、nhibernate 3.0、spring.net 1.3.1和SQLite生成db模式。NHibernate生成的创建/更新脚本为 create table LogEntries (Id UNIQUEIDENTIFIER not null, Hostname TEXT not null, LoggerName TEXT not null, LogLevel INTEGER not null, Message TEXT not null, pri

我正在尝试使用fluent nhibernate、nhibernate 3.0、spring.net 1.3.1和SQLite生成db模式。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; }
}
公共类日志条目
{
公共虚拟Guid Id{get;set;}
公共虚拟字符串LoggerName{get;set;}
公共虚拟字符串消息{get;set;}
公共虚拟整数LogLevel{get;set;}
公共虚拟字符串主机名{get;set;}
公共虚拟IList属性{get;set;}
}
公共类财产
{
公共虚拟整数Id{get;set;}
公共虚拟字符串键{get;set;}
公共虚拟字符串值{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);
    }
}
公共类LogEntryMap:ClassMap
{
公共LogEntryMap()
{
表(“日志条目”);
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();
}
}
公共类属性映射:类映射
{
公共财产映射()
{
表(“财产”);
Id(x=>x.Id).GeneratedBy.Increment();
Map(x=>x.Key);
Map(x=>x.Value);
}
}

我目前正在学习NHibernate(阅读NHibernate 3.0烹饪书),所以我绝对不是专家

我现在也遇到了同样的问题,在SQLite环境中有很多映射父项.Children。这也会在索引语法错误时崩溃

根据我的推断,索引是一个保留关键字(在几乎所有的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)
)
因此,可以考虑:

  • 指定不是关键字的自定义索引列名称
  • 依靠backtick自动转义(不知道这里发生了什么,没有时间检查)
  • 如果您实际上不需要有序列表,请使用不同的集合类型。看

发现了问题。在logEntry的映射类中,我使用了AsList()。当我删除此项时,它对我有效,指定
索引
有效-在您的代码中,看起来您缺少第二个回勾。