使用DropDownList的内容更新NHibernate模型对象时出现问题

时间:2012-11-08 11:33:12

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

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

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

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

public virtual Category Category { get; set; }

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

所以我的表单有一个“类别”下拉列表。此下拉列表已加载所有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;

我该怎么做?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

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