【问题标题】:Nhibernate bind to DataGridView, insert doesn't workNhibernate绑定到DataGridView,插入不起作用
【发布时间】:2012-02-04 15:45:40
【问题描述】:

要将 NHibernate 类绑定到 DataGridView 我这样做:

IList<DatabaseAccess.poco.Employee> employees =
                (from e in session.Linq<DatabaseAccess.poco.Employee>() select e).ToList<DatabaseAccess.poco.Employee>();

this.employeeBindingSource.DataSource = employees;

当我提交时,只发送数据库中已经存在的行的更改,使用网格创建新行不起作用。

那么,我可以期望将列表绑定到DataSource 就足够了,而且我不必创建 Employee 对象并执行session.Save(new_employee); 吗?还是必须的?

我还没有找到任何描述完整 DataGridView 绑定以及创建新行的教程。

【问题讨论】:

    标签: nhibernate datagridview


    【解决方案1】:

    这是必须的。 DataGridView 不知道 NH 并且 NH 不知道 DataGridView 添加了新行。因此,例如,您必须在 UserAddedRow 事件处理程序中保存新实体。

    using (ITransaction tx = session.BeginTransaction())
    {
        session.Save(albumBindingSource.Current);
        tx.Commit();
    }
    

    【讨论】:

    • 在您关闭会话之前,NH 会跟踪检索到的每个会话缓存实体。当您调用 ITransaction.Commit() 时,NH 会更新所有已修改的实体。
    • 提交后我得到:行被另一个事务更新或删除(或未保存的值映射不正确)。
    【解决方案2】:

    在 page_load 方法中,您的数据网格是否绑定在 IsPostBack 中。

    像这样:

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //Grid Bind
            }
        }
    

    【讨论】:

    • 我不使用 Asp.Net。仅 Winforms
    • 首先,您必须确认插入操作工作。如果插入不起作用。您的 session.Save(new_employee) 方法是否添加了事务属性?像这样 [Transaction(TransactionMode.Requires)]
    • insert 仅适用于网格。我可以添加新记录,但提交后没有任何内容发送到数据库。更新作品。
    • 我没有使用 session.Save(...)。我在想网格为我做这个。就像它适用于更新操作一样。
    • 在 nhibernate 中,插入、更新、删除操作应该在事务中进行。尤其是在这些操作有选择之后。
    猜你喜欢
    • 2012-02-12
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2012-04-15
    相关资源
    最近更新 更多