与Sqlite UniqueIdentifier的GUID连接导致NHibernate中的查询错误

时间:2014-10-03 19:54:30

标签: c# sqlite nhibernate fluent-nhibernate

我正在使用某人的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的约定。

2 个答案:

答案 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。