Nhibernate LazyInitializationException after Session.Clear

本文关键字:Clear Session after LazyInitializationException Nhibernate | 更新日期: 2023-09-27 18:32:50

在我的应用程序中,在每次查询之前,我想执行以下操作

public List<Supplier> GetAllSuppliers()
{
        NHibernateHelper.Session.Clear();
        string query = "from Supplier order by FirstName, LastName asc ";
        var result = NHibernateHelper.Session.CreateQuery(query).List<Supplier>();
        return (List<Supplier>)result ?? new List<Supplier>();
}

以下代码行旨在清除会话,因此当我查询所有供应商时,我希望从数据库而不是缓存中再次获得整个列表。因为NHibernate会记住该对象或类似的东西,并且不会收到数据库中所做的更改(我的应用程序在多台计算机上使用,这是我想获取"实时"数据的主要原因(

NHibernateHelper.Session.Clear();

但是我的供应商对象有一个延迟加载的地址对象。在我的列表中,我选择了该供应商对象,它显示了它的名称和地址。这就是错误发生的时候:

An unhandled exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll
Additional information: Initializing[Model.Supplier#1]-Could not initialize proxy - no Session.

如果在注释中设置该行代码它有效...但我不希望它使用缓存的行为......

供应商映射

    public SupplierMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.Btw);
        Map(x => x.Email);
        Map(x => x.Fax);
        Map(x => x.Telephone);           
        References(x => x.Address).Cascade.All();
        HasMany(x => x.Articles);
        Table("tbl_suppliers");
    }

地址映射

    public AddressMap()
    {
        Id(x => x.Id);
        Map(x => x.Street).Length(10000);
        Map(x => x.Number).Length(10000);
        Map(x => x.Zip).Length(10000);
        Map(x => x.City).Length(10000);
        Map(x => x.Country).Length(10000);
        Table("tbl_addresses");
    }

对这个问题有什么想法吗?

编辑我找到了以下链接:https://nhibernate.jira.com/browse/NH-2791似乎是同样的问题,但没有解决方案...

Nhibernate LazyInitializationException after Session.Clear

我相信

,你已经试图找到答案,你已经搜索了很多。而你之所以没有找到它,是因为你试图做一些非常不实用的事情。

Session(ISession(抽象是有目的的,它带来了很多优势。如果我们不喜欢从 Session 中获利,我们可以使用 StatelessSession 方法,但大多数情况下我们需要 Session 概念。

事实上,我看到的真正问题隐藏在标签"WPF"中。您正在尝试将 NHibernate 与 WPF 一起使用,并且会话似乎运行了很长时间......然后它可以返回过时的数据...

解决方案应采用正确的 WPF/NHibernate 会话生存期设置,可能最适合您的来源在这里:

使用 NHibernate 构建桌面待办事项应用程序