在我的每个查询之前的应用程序中,我想执行以下操作
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();
但我的Supplier对象有一个延迟加载的Address对象。在我的列表中,我选择了该供应商对象,并显示了它的名称和地址。那就是错误发生时:
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 似乎是同样的问题,但没有解决方案...
答案 0 :(得分:1)
我相信,你试图找到答案,你已经搜索了很多。而你没有找到它的原因是因为你试图做一些非常不寻常的事情。
Session
(ISession)抽象是有目的的,它带来了很多优势。 如果我们不想从Session获利,我们可以使用StatelessSession方法,但主要是我们需要Session概念。
事实上,我看到的真正问题隐藏在标签“WPF”中。您正在尝试将NHibernate与WPF
一起使用,并且Session似乎运行了很长时间......然后它可以返回过时的数据......
解决方案应该是正确的WPF / NHibernate会话生命周期设置,可能最适合您的来源是: