NHibernate - отложенная загрузка: ни одна сессия не была закрыта - PullRequest
1 голос
/ 18 апреля 2011

Меня смущает следующее поведение NHibernate:
Классы домена и сопоставления:

public class Category
{
    public virtual int ID { get; set; }
    public virtual string Name { get; set; }

    private IList<Product> _products;
    public virtual IList<Product> Products
    {
        get { return new List<Product>(_products).AsReadOnly(); }
    }

    public Category()
    {
        _products = new List<Product>();
    }
}
public class Product
{
    public virtual int ID { get; set; }
    public virtual string Name { get; set; }
    public virtual Category Category { get;set; }
}
public class ProductMap : ClassMap<Product>
{
    public ProductMap()
    {
        Schema("dbo");
        Table("tProducts");

        Id(x => x.ID);
        Map(x => x.Name);
        References(x => x.Category).Column("CategoryID");
    }
}
public class CategoryMap : ClassMap<Category>
{
    public CategoryMap()
    {
        Schema("dbo");
        Table("tCategories");

        Id(x => x.ID);
        Map(x => x.Name);
        HasMany(x => x.Products)
            .KeyColumn("CategoryID")
            .Access.CamelCaseField(Prefix.Underscore)
            .Inverse()
            .Cascade.All();
    }
}

Код, вызывающий проблему:

    Category category;

    using (var session = sessionFactory.OpenSession())
    {
        category = session.Get<Category>(1);
    }

    using (var session = sessionFactory.OpenSession())
    {
        var products = category.Products; // exception
    }

Почему я не получаю исключения для сеанса, когда я пытаюсь получить продукты? У меня здесь сессия! Как избежать этого исключения (я предпочитаю 2 сессии здесь, и я хочу продолжать загружаться лениво)?
Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 18 апреля 2011

Вы можете повторно присоединить объект к вашему новому сеансу:

ISession.Update(myDetachedInstance);  

или, если объект не был изменен:

ISession.Lock(myDetachedInstance, NHibernate.LockMode.None);  

Для получения дополнительной информации см .:http://intellect.dk/post/Detached-objects-in-nHibernate-and-Lazy-loading.aspx

1 голос
/ 19 июня 2012

Я получил эту же ошибку, и это произошло из-за того, что пользовательский интерфейс WPF удерживал ссылки на объекты из старого сеанса nhibernate после того, как я нажал кнопку «обновить», которая вызвала обновление контекста данных, который отменил все кэшированные объекты в сеансе .

Мне нужно было убедиться, что «NotifyChange» запускается для обновления пользовательского интерфейса (и что пользовательский интерфейс слушал его).

...