流利的NHibernate,varbinary(最大)和SQLite

Cha*_*let 7 .net c# mapping nhibernate fluent-nhibernate

我的sql server数据库中有一个varbinary字段,需要varbinary(max).我使用NHibernate创建数据库,并使用Fluent Nhibernate作为映射.

我也使用SQLite进行单元测试,我使用相同的映射我只是在内存中创建数据库之前更改配置.

我遇到以下问题.

我创建了这个扩展方法:

 public static IProperty WithMaxVarBinaryLength(this IProperty propertyMap)
 {
     return propertyMap.CustomSqlTypeIs("varbinary(max)");
 }
Run Code Online (Sandbox Code Playgroud)

它在我的网站上工作正常,数据库是用varbinary(max)字段创建的,但是当我运行单元测试时,我得到以下异常

System.Data.SQLite.SQLiteException: SQLite error near "max": syntax error
Run Code Online (Sandbox Code Playgroud)

然后我在stackoverflow的另一个问题中发现我们可以这样做来创建一个varbinary(max):

public static IProperty WithMaxLength(this IProperty propertyMap)
{
    return propertyMap.WithLengthOf(1000);
}
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个例外:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: Content is not a string. at FluentNHibernate.Mapping.PropertyMap.WithLengthOf(Int32 length) in d:\Builds\FluentNH\src\FluentNHibernate\Mapping\PropertyMap.cs:line 166
Run Code Online (Sandbox Code Playgroud)

目前我不知道,我不想手动创建所有数据库脚本,我想继续使用SQLite进行单元测试.

谢谢您的帮助.

顺便说一句,这是我的完整映射,请注意我使用了我的扩展方法.

public class AttachmentFileMap : ClassMap<AttachmentFile>
{
    public AttachmentFileMap()
    {
        WithTable("AttachmentFiles");

        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.Content).WithMaxVarBinaryLength();
        Map(x => x.ContentType);
        Map(x => x.FileName);
        Map(x => x.ContentLength);
    }
}
Run Code Online (Sandbox Code Playgroud)

内容是一个字节[]

查尔斯

fjx*_*jxx 5

使用 SQL lite + NHibernate 进行单元测试时也可能会遇到此问题。

解决办法是将MAX替换为2147483647

完整的描述可以在这里找到:http://www.tigraine.at/2009/08/17/the-fairy-tale-of-binary-blob-fields/


Cha*_*let 4

最后我发现新版本的 Fluent Nhibernate 纠正了这个问题,你现在可以在 byte[] 类型的属性之后使用 .Length() 并且它可以完美地工作。

我还必须更新 Nhibernate dll 并更改映射类中的一些代码,因为新版本的 Fluent Nhibernate 已重命名新版本中的一些方法。