[英]NHibernate Session in WPF MVVM
我正在使用WPF
与NHibernate
当前使用单个会话与多个线程,导致与此链接相同的许多错误。 所以现在我必须在完成后立即开始和关闭会话。 但问题将是懒惰的数据。 我很困惑如何用MVVM获取它们如下: -
class Product
{
public virtual string name{get;set;}
public virtual Session session{get;set;} // Lazy
public virtual Categories cate{get;set;} //Lazy
public virtual Warehose warehouse{get;set;} //Lazy
public virtual string NAME
{
get { return Name; }
set
{
Name = value;
OnPropertyChanged("NAME");
}
}
public virtual string TerminalName
{
get { return session.terminal.terminalName; }
set
{
session.terminal.terminalName= value;
OnPropertyChanged("TerminalName");
}
}
public virtual string CateName
{
get { return session.cate.catename; }
set
{
session.cate.catename= value;
OnPropertyChanged("CateName");
}
}
public virtual string UserName
{
get { return session.user.username; }
set
{
session.user.username= value;
OnPropertyChanged("UserName");
}
}
}
class Categories {
public virtual string catename{set;get;}
}
class Warehose {
public virtual string warename{set;get;}
}
class Session{
public virtual People user{get;set;} //Lazy
public virtual Terminal terminal{get;set;} //Lazy
//... other properties
}
Class People{
public virtual string username{set;get;}
}
Class Terminal{
public virtual string terminalName{set;get;}
}
我将从列表中的数据库中获取数据,并将其作为itemsource
提供给DataGrid,如下所示
<DataGrid Name="saleDataGrid"
<DataGrid.Columns >
<DataGridTextColumn Binding="{Binding NAME}" FontSize="12"
CanUserResize="False" Width="70" Header="Code"/>
<DataGridTextColumn Binding="{Binding TerminalName}" FontSize="12"
Header="Desciption" Width="120" CanUserResize="False"/>
<DataGridTextColumn Binding="{Binding CateName}" FontSize="12"
Header="Price" Width="50" CanUserResize="False"/>
<DataGridTextColumn Binding="{Binding UserName}" FontSize="12"
CanUserResize="False" Width="45" Header="QTY"/>
</DataGrid.Columns>
</DataGrid>
所以当我关闭连接并且当DataGrid
显示那个时候我因为会话关闭而得到延迟异常时。 我不知道该怎么办。 如果会话关闭,任何人都可以建议使用MVVM获取延迟数据。 我不想使用急切加载作为解决方案。
请告诉我您需要更多信息。
谢谢Anchit
在大多数情况下,您有三个选项,它们独立于您使用的ORM,因为ORM的行为非常相似:
解决此问题的一种方法是在创建会话工厂时thread_static
上下文状态设置为“ thread_static
”,
如果Fluent NHibernate
public class NHibernateConfig
{
public static Configuration Configure()
{
var cfg = Fluently.Configure()
.Database(...)
.Mappings(...)
.ExposeConfiguration(x => x.SetProperty("current_session_context_class", "thread_static"))
.BuildConfiguration();
return cfg;
}
}
如果是XML文件
<props>
...
<prop key="hibernate.current_session_context_class ">thread</prop>
...
</props>
这将保持每个线程的会话,您将不必处理跨多个线程共享同一会话的问题。
但是,保持会话打开很长时间并不是一个好主意,因此可能在您启动新视图时,您可以创建一个新会话并在退出视图时关闭它,它不会影响延迟加载。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.