Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NHibernate.Linq System.Nullable抛出ArgumentException,值为&引用;这不是类型_Nhibernate_Linq To Nhibernate - Fatal编程技术网

NHibernate.Linq System.Nullable抛出ArgumentException,值为&引用;这不是类型

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

我有一个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? 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。