У меня есть класс типа MetadataRecord:NHibernate.Linq System.Nullable бросает ArgumentException, значение "" не печатают
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>
I 'm запускает единичный тест против этого класса, чтобы проверить значения, возвращаемые IntegerObject, который является нулевым типом long, из экземпляра MetadataRecord. Я использую NHibernate.Linq (ст 1.1.0.1001) для запроса следующим образом:
[TestMethod()]
public void IntegerObjectTest() {
var integerObject = _sessionFactory.OpenSession().Linq<MetadataRecord>()
.Where(m => m.ObjectId == 65675L)
.Select(m => m.IntegerObject)
.FirstOrDefault();
Assert.IsNull(integerObject);
}
Столбец INTEGER_OBJECT из соответствующей таблицы обнуляемый, и я ожидаю, IsNull быть истинным или ложным. Тем не менее, я получаю следующее сообщение об ошибке:
Test method ActiveMediaMetadataViewerTestProject.MetadataRecordTest.IntegerObjectTest threw exception: NHibernate.Exceptions.GenericADOException: Unable to perform find[SQL: SQL not available] ---> System.ArgumentException: The value "" is not of type "System.Nullable`1[System.Int64]" and cannot be used in this generic collection. Parameter name: value.
Я не могу понять, почему он пытается бросить строку обнуляемого типа. Есть ли другой способ, с помощью которого я должен открывать сеанс, украшая класс, даже создавая файл сопоставления ..... где я здесь ошибаюсь? Я мог бы прибегнуть к использованию критериев, но мне очень понравилось intellisense и «refactorability» с Linq.
Я не работал над этим проектом в ближайшие годы, но 'новый длинный()' выглядит билет?. Я предполагаю, что это работает и полезно для кого-то там. Спасибо @RobertJ. – Lennox