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

标签 c# nhibernate fluent-nhibernate sqlite

我正在尝试使用 Fluent 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);
    }
}

最佳答案

我目前正在自己​​学习 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

关于c# - Nhibernate 在 db create 脚本中生成错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4711158/

相关文章:

asp.net-mvc - 已经为此应用程序配置了存储机制

NHibernate (Fluent) 延迟加载不起作用

nhibernate - Fluent NHibernate 表命名约定不起作用

c# - NHibernate 连接 + 合并

c# - 使用动态表达式 API 时验证 ASP.NET MVC 3 Controller 的操作参数

Nhibernate 组件映射 : Parent Object null in Value Object while querying from database

c# - 在 WPF 中使用 Oxyplot 进行数据绑定(bind)

c# - NHibernate 自动将我的对象更新到数据库,而无需在 Asp.Net MVC 中调用 SaveOrUpdate

c# - 在发布版本中获取 System.Diagnostics.Debug.Assert() 的行为?

c# - 在 MVC 4 的部分 View 中使用 PagedList 在导航 'paged' 页面时抛出 jQuery/JS