【问题标题】:Problems updating an NHibernate model object with the contents of a DropDownList使用 DropDownList 的内容更新 NHibernate 模型对象时出现问题
【发布时间】:2012-11-09 02:14:33
【问题描述】:

我是 NHibernate 的新手,但对 EF4 有更好的了解。

我有一个基本的“编辑项目”页面,在提交时我想用表单中的值更新我的项目对象。 FWIW,我正在使用 FormView 并在可行的情况下利用新的 WebForms 模型绑定功能。

我的“项目”对象有一个属性:

public virtual Category Category { get; set; }

对应于数据库中的一个外键关系(“CategoryId”列指向“Category”表。)

所以我的表单有一个“类别”下拉菜单。此下拉列表已加载所有类别对象的列表。

提交时,我要做的就是将 Category 下拉列表中的选定值分配给我的 Item 对象的 Category 属性。很直截了当,对吧? :)

但是我遇到了困难:

  • 我可以轻松获得 dropdown.SelectedValue,但我无法将它分配给我的 Item 对象。在 EF4 中,我的 Item 对象将使用 Foreign Key Association,因此将同时具有 CategoryCategoryId 属性,它们将自动保持同步。当我在 NHibernate 中尝试类似的操作时,由于尝试多次使用单个列而出现 Invalid Index for this SqlParameterCollection 错误。

  • 我很容易得到 dropdown.SelectedItem,但这是 ListItem 类型,不能转换为 Category

  • 我尝试使用 dropdown.DataSource 属性(可能访问“SelectedIndex-th”项),但在单步执行代码时,此 DataSource 值为 null。

到目前为止,我最好的(糟糕的)解决方案如下:

var dropdown = (DropDownList)MyFormView.FindControl("dropdown");
var id = dropdown.SelectedValue;
var category = new MyRepository().GetCategoryById(id);
item.Category = category;

所以我要进行额外的存储库调用,并再次获取整个 Category 对象,而我真正想做的只是:

item.CategoryId = id;

我应该怎么做?

【问题讨论】:

    标签: asp.net nhibernate webforms asp.net-4.5


    【解决方案1】:

    当您知道 id 时使用 Session.Load 以避免访问数据库。 Load 将创建一个动态代理并允许使用正确的 CategoryId 持久化项目。负载是无状态应用程序中的最佳解决方案。

    var dropdown = (DropDownList)MyFormView.FindControl("dropdown");
    var id = dropdown.SelectedValue; // may need to cast to int
    item.Category = session.Load<Category>(id);
    

    【讨论】:

    • 感谢 Jamie #2:这种方法类似于我已经得到的方法,尽管我现在(部分 :) 了解“获取”和“加载”之间的区别。在我的情况下(使用“每个请求的会话”),回发时当前会话中没有“类别”值。因此,当我想要做的只是在“项目”对象上设置 CategoryId(我已经拥有)时,它仍在进行数据库访问以检索完整的 Category 对象。
    • Load 应该这样做。但是,我在自己的代码中看到它有时仍会访问数据库。我知道何时会发生这种情况有两个原因:延迟加载被禁用或访问了 id 以外的属性。
    【解决方案2】:

    您不需要获取类别对象,只需创建一个新的类别对象并动态设置id即可。

    var dropdown = (DropDownList)MyFormView.FindControl("dropdown");
    var id = dropdown.SelectedValue;
    item.Category = new Category { CategoryId = id };
    

    【讨论】:

    • 感谢 Jamie #1,尽管它对我不起作用。第一个错误:“对象引用了未保存的瞬态实例”。然后我在我的 HBM 的 FK 定义中添加了“cascade=All”。这给出了第二个错误:“could not insert: [Category#MyID]”.... NH 将您的“new Category {}”语句解释为插入请求。
    猜你喜欢
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 2021-07-05
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多