Свободный NHibernate: получение ошибки «Не удалось инициализировать коллекцию» при отладке теста NUnit в SharpDevelop - PullRequest
2 голосов
/ 18 октября 2011

При попытке работать с ничем не примечательным объектом с набором других объектов в качестве члена я получаю следующую ошибку при использовании NHibernate в качестве моего инструмента ORM.Когда объект верхнего уровня не имеет объектов в указанной коллекции, я получаю сообщение об ошибке типа «Не удалось инициализировать коллекцию: (тонна SQL)».Я знаю, что таблица, на которую она ссылается, пуста, как и должна быть коллекция, но NHibernate, кажется, пытается заполнить ее, а затем выдает исключение, потому что нет данных.

Я бы ожидал, что коллекция будет просто нулевой или пустой, а не остановит выполнение программы, для меня это выглядит как ошибка NHibernate, но возможно, что я неправильно упаковал объекты ORM и т. Д., Как и яотносительно новый в технологии.Мое сопоставление прилагается ниже.Коллекция _holdings - это то, что выдает ошибку.

public class FundMap : ClassMap<Fund>
{
    public FundMap() 
    {
        Id(x => x._fundID).GeneratedBy.Identity();
        Map(x => x._cik);
        Map(x => x._fundName);
        //TODO: get correct handling of HasMany relationships.
        HasMany(x => x._holdings)
            //.Inverse()
            .Cascade.All();
            //.Cascade.None();
    }
}

1 Ответ

3 голосов
/ 18 октября 2011

NH всегда присоединяет свою собственную реализацию списка к объекту, который лениво загружает содержимое при первом доступе. Он только знает после запроса БД, что коллекция действительно пуста.

Я предполагаю, что отображение Holding не соответствует отображению hasmany. рассмотрим что-то вроде этого:

public HoldingMap()
{
    References(x => x.Fund, "f_id");
}

public FundMap()
{
    HasMany(x => x._holdings)
        //.Column("fund_id")     // the default
        .Cascade.All();
}

Hasmany не имеет правильного столбца внешнего ключа и не может загрузить вклады. Вы можете решить это с явным указанием столбца

    HasMany(x => x._holdings)
        .Column("f_id")     // same as in Holding
        .Cascade.All();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...