2010-01-07 2 views
2

У меня есть класс типа 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.

ответ

1

Лучшее решение (перевод на SQL в целом):

[TestMethod()] 
public void IntegerObjectTest() { 
    var integerObject = _sessionFactory.OpenSession().Linq<MetadataRecord>() 
             .Where(m => m.ObjectId == 65675L) 
             .Select(m => new long?(m.IntegerObject))           
             .FirstOrDefault(); 
    Assert.IsNull(integerObject); 
} 
+0

Я не работал над этим проектом в ближайшие годы, но 'новый длинный()' выглядит билет?. Я предполагаю, что это работает и полезно для кого-то там. Спасибо @RobertJ. – Lennox

1

Мой обходной путь:

[TestMethod()] 
public void IntegerObjectTest() { 
    var integerObject = _sessionFactory.OpenSession().Linq<MetadataRecord>() 
             .Where(m => m.ObjectId == 65675L) 
             .Select(m => m.IntegerObject) 
             .AsEnumerable() 
             .FirstOrDefault(); 
    Assert.IsNull(integerObject); 
} 

По какой-то причине, NHibernate.Linq не любит вызова First(), FirstOrDefault() (и я предполагаю, Single() и SingleOrDefault()) на обнуляемых типов, и выдает указанную выше ошибку, если поле равно null. Он отлично работает, если тип с нулевым значением действительно имеет значение. Если я выталкиваю результаты в коллекцию памяти через AsEnumerable(), ToArray(), ToList() и т. Д., Тогда она играет хорошо и возвращает мой тип с нулевым значением.

Смежные вопросы