我对NHibernate和Session有点困惑。据我所知,我应该“尽快”使用会话,这意味着两个不同的交互会有自己的会话。
在UI交互的情况下我该怎么做,我想存储在数据库中。我有一个简单的例子,其中一个树形视图列出了一些项目,并绑定到我的业务对象的IsExpanded属性(我知道这是不好的做法,但对我的方法来说是可以的)……
现在的问题是,我什么时候保存更改。目前我正在关闭窗口时手动冲洗,这似乎不太正确。我可以在每次属性改变时刷新,但我认为这完全是过度杀伤力。
对于这类问题,有没有什么模式或提示?就像是“在合适的时候整理和存储GUI信息”……
为了更好地理解,下面是一些代码:
    private static PjmDbController _d;
    private static IList<Topic> _allItems;
    private static void TopicStoresChildStatesExpandedOrNot()
    {
        var w = new Window();
        _d = new PjmDbController();
        _allItems = _d.GetAllRoots();
        w.Content = new PjmTreeView<Topic>() {ItemsSource = _allItems};
        w.Show();
        w.Closed += new EventHandler(w_Closed);
    }
    static void w_Closed(object sender, EventArgs e)
    {
        _d.Session.Flush();
    }谢谢你的建议,克里斯
PS:静态仅用于测试:-)
发布于 2010-01-17 01:57:05
它完全取决于应用程序中工作单元的范围。使用NHibernate的最佳实践是将会话视为一个工作单元。如果打开窗体、操作树和关闭窗体代表单个工作单元,那么在窗体关闭时刷新会话是有意义的。但是,我会在事务内持久化更改,而不是刷新会话。关于管理会话,This answer是一个很好的建议。
发布于 2010-01-17 01:49:16
这一切都应该与用户通常选择保存操作的时间相关(例如,通过“保存更改”按钮,或在退出表单时确认保存)。
(作为附录)在您确实希望实时持久性发生而不需要用户干预的情况下(例如,在游戏中保存状态等)然后,一种模式是使用基于时间的排队,因此在更改操作中,如果上次保存的时间超过X秒,则持久化您的对象-因为基于卷的每次更改的保存可能是过度的。
https://stackoverflow.com/questions/2078314
复制相似问题