NHibernate.Linq System.Nullable抛出ArgumentException,值为&引用;这不是类型
我有一个MetadataRecord类型的类:NHibernate.Linq System.Nullable抛出ArgumentException,值为&引用;这不是类型,nhibernate,linq-to-nhibernate,Nhibernate,Linq To Nhibernate,我有一个MetadataRecord类型的类: public class MetadataRecord { public virtual long? IntegerObject { get; set; } public virtual string ClassName { get; set; } public virtual DateTime? DateObject { get; set; } public virtual double? DecimalObjec
public class MetadataRecord {
public virtual long? IntegerObject { get; set; }
public virtual string ClassName { get; set; }
public virtual DateTime? DateObject { get; set; }
public virtual double? DecimalObject { get; set; }
public virtual long MetadataId { get; set; }
public virtual long MetadataLabelId { get; set; }
public virtual long ObjectId { get; set; }
public virtual string StringObject { get; set; }
public virtual Asset Asset { get; set; }
}
和匹配的映射文件,如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="ActiveMediaDataAccess"
namespace="ActiveMediaDataAccess.Entities">
<class name="MetadataRecord" table="WM_META_DATA" lazy="true">
<id name="MetadataId" column="META_DATA_ID">
<generator class="seqhilo" />
</id>
<property name="MetadataLabelId" column="META_DATA_LABEL_ID" />
<property name="ObjectId" column="OBJECT_ID" />
<property name="ClassName" column="CLASS_NAME" />
<property name="IntegerObject" column="INTEGER_OBJECT" />
<property name="DecimalObject" column="DECIMAL_OBJECT" />
<property name="DateObject" column="DATE_OBJECT" />
<property name="StringObject" column="STRING_OBJECT" />
<many-to-one name="Asset" column="OBJECT_ID" not-null="true" />
</class>
</hibernate-mapping>
[TestMethod()]
public void IntegerObjectTest() {
var integerObject = _sessionFactory.OpenSession().Linq<MetadataRecord>()
.Where(m => m.ObjectId == 65675L)
.Select(m => m.IntegerObject)
.FirstOrDefault();
Assert.IsNull(integerObject);
}
我正在对这个类运行一个单元测试,以检查IntegerObject从MetadataRecord实例返回的值,IntegerObject是一个可为null的long类型。我使用NHibernate.Linq(v1.1.0.1001)进行如下查询:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="ActiveMediaDataAccess"
namespace="ActiveMediaDataAccess.Entities">
<class name="MetadataRecord" table="WM_META_DATA" lazy="true">
<id name="MetadataId" column="META_DATA_ID">
<generator class="seqhilo" />
</id>
<property name="MetadataLabelId" column="META_DATA_LABEL_ID" />
<property name="ObjectId" column="OBJECT_ID" />
<property name="ClassName" column="CLASS_NAME" />
<property name="IntegerObject" column="INTEGER_OBJECT" />
<property name="DecimalObject" column="DECIMAL_OBJECT" />
<property name="DateObject" column="DATE_OBJECT" />
<property name="StringObject" column="STRING_OBJECT" />
<many-to-one name="Asset" column="OBJECT_ID" not-null="true" />
</class>
</hibernate-mapping>
[TestMethod()]
public void IntegerObjectTest() {
var integerObject = _sessionFactory.OpenSession().Linq<MetadataRecord>()
.Where(m => m.ObjectId == 65675L)
.Select(m => m.IntegerObject)
.FirstOrDefault();
Assert.IsNull(integerObject);
}
[TestMethod()]
public void IntegerObjectTest(){
var integerObject=\u sessionFactory.OpenSession().Linq()
.其中(m=>m.ObjectId==65675L)
.Select(m=>m.IntegerObject)
.FirstOrDefault();
IsNull(integerObject);
}
对应表中的INTEGER_OBJECT列可以为null,我希望IsNull为true或false。但是,我得到以下错误:
测试方法ActiveMediaMetadataViewerTestProject.MetadataRecordTest.IntegerObjectTest引发异常:NHibernate.Exceptions.GenericDoException:无法执行查找[SQL:SQL不可用]-->System.ArgumentException:值“”不是“System.Nullable`1[System.Int64]”类型,无法在此泛型集合中使用。
参数名称:value
我不明白为什么它试图将字符串强制转换为可为null的类型。是否有其他方法可以打开会话,装饰类,甚至构建映射文件。。。。。我哪里出了问题?我可以求助于使用标准,但我非常喜欢Linq的智能感知和“可重构性”。我的解决方法:
[TestMethod()]
public void IntegerObjectTest() {
var integerObject = _sessionFactory.OpenSession().Linq<MetadataRecord>()
.Where(m => m.ObjectId == 65675L)
.Select(m => m.IntegerObject)
.AsEnumerable()
.FirstOrDefault();
Assert.IsNull(integerObject);
}
[TestMethod()]
public void IntegerObjectTest(){
var integerObject=\u sessionFactory.OpenSession().Linq()
.其中(m=>m.ObjectId==65675L)
.Select(m=>m.IntegerObject)
.可计算的()
.FirstOrDefault();
IsNull(integerObject);
}
出于某种原因,NHibernate.Linq不喜欢对可空类型调用First()、FirstOrDefault()(我猜是Single()和SingleOrDefault()),如果字段为null,则抛出上述错误。如果可为null的类型实际上有一个值,那么它就可以正常工作。如果我通过AsEnumerable()、ToArray()、ToList()等将结果推送到内存中的集合中,那么它会很好地播放并返回我的可为空类型 更好的解决方案(整体翻译成SQL):
[TestMethod()]
public void IntegerObjectTest(){
var integerObject=\u sessionFactory.OpenSession().Linq()
.其中(m=>m.ObjectId==65675L)
.Select(m=>new long?(m.IntegerObject))
.FirstOrDefault();
IsNull(integerObject);
}
我已经好几年没有参与这个项目了,但是新的long?()
看起来很不错。我认为这是可行的,并且对其他人有帮助。谢谢@RobertJ。