繁体   English   中英

WPF MVVM中的NHibernate会话

[英]NHibernate Session in WPF MVVM

我正在使用WPFNHibernate当前使用单个会话与多个线程,导致与链接相同的许多错误。 所以现在我必须在完成后立即开始和关闭会话。 但问题将是懒惰的数据。 我很困惑如何用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的行为非常相似:

  • 让视图模型存在时,会话/上下文对象的存活时间;
  • 以这种方式构建模型(MVVM中的“M”),允许您在需要时懒惰地获取数据(每次都创建新的会话/上下文对象)。 这会关闭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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM