我正在尝试使用 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/