我正在使用某人的Sql Server数据库和Fluent NHibernate映射模型,我使用(我自己的)SQLite数据库进行测试。
一个表名为“Trad”,包含一个“TradId”列,它是一个GUID类型,因此被声明为
public virtual Guid TradId { get; set; }
并映射:
Id(x => x.TradId).Column("TradID").GeneratedBy.Assigned();
为了在我的SqlLite数据库中进行测试,它使用“UniqueIdentifier”类型声明,我相信它映射到一个字符串。
TradID UNIQUEIDENTIFIER NOT NULL collate nocase,
通常这种方法很好,除非NHibernate尝试通过ID值获取,这在连接到子记录时会出现。
Nhibernate吐出来:
[...] WHERE this_.TradID = @p0;@p0 = ac3e30ff-e767-440f-ab1f-0000293c5a0c [Type: Guid (0)]
但这不起作用,因为我认为它需要作为字符串处理。 我是否应该使用Sqlite连接以不同方式映射这些内容?或者还有其他我想念的东西?
=============================================== =========================
其他信息
我使用此代码进行单元测试:
var session = this.openSession;
var trad = session.Query<Trad>()
.FetchMany(x => x.TradInventeringList)
.ToList()[0];
var surveys = session.Query<TradInventering>()
.Where(x => x.Trad.TradId == trad.TradId)
.ToList();
Assert.Greater(surveys.Count, 0);
如果我的会话连接到我的SqlServer(实时)数据库,则会运行此代码,但对我的Sqlite数据库失败。
我想知道是否需要在我的Fluently.Configure中添加基于IPropertyConvention的约定。
答案 0 :(得分:3)
在花费太多时间搞乱PropertyConventions之后,我在Hibernating Rhinos上看到了这个post。
只需将FluentNhibernate SQLiteConfiguration重写为:
即可解决问题 config =
SQLiteConfiguration.Standard
.ConnectionString(
"Data Source=" + databaseFilename + ";Version=3;BinaryGuid=False")
.ShowSql();
设置BinaryGuid = False可以解决问题。现在它工作正常。
答案 1 :(得分:0)
你试过uuid.string生成器吗?它使用转换为字符串的GUID。