我的sql server数据库中有一个varbinary字段,需要varbinary(max)。我使用NHibernate创建数据库,并使用Fluent Nhibernate作为映射。
我也使用SQLite进行单元测试,我使用相同的映射我只是在内存中创建数据库之前更改配置。
我遇到以下问题。
我创建了这个扩展方法:
public static IProperty WithMaxVarBinaryLength(this IProperty propertyMap)
{
return propertyMap.CustomSqlTypeIs("varbinary(max)");
}
它在我的网站上工作正常,数据库是用varbinary(max)字段创建的,但是当我运行单元测试时,我得到以下异常
System.Data.SQLite.SQLiteException: SQLite error near "max": syntax error
然后我在stackoverflow的另一个问题中发现我们可以这样做来创建一个varbinary(max):
public static IProperty WithMaxLength(this IProperty propertyMap)
{
return propertyMap.WithLengthOf(1000);
}
但我得到了这个例外:
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
目前我不知道,我不想手动创建所有数据库脚本,我想继续使用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);
}
}
内容是一个字节[]
查尔斯
答案 0 :(得分:4)
最后我发现Fluent Nhibernate的新版本纠正了这个问题,你现在可以在byte []类型的属性之后使用.Length()并且它可以很好地工作。
我还必须更新我的Nhibernate dll并更改我的映射类中的一些代码,因为Fluent Nhibernate的新版本已在新版本中重命名了一些方法。
答案 1 :(得分:4)
使用SQL lite + NHibernate进行单元测试时,也可能遇到此问题。
解决方案是用2147483647替换MAX
完整说明可在此处找到:http://www.tigraine.at/2009/08/17/the-fairy-tale-of-binary-blob-fields/