1

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

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

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

public virtual Category Category { get; set; }

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

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

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

但是我遇到了困难:

  • 我可以轻松获得 dropdown.SelectedValue,但我无法将其分配给我的 Item 对象。在 EF4 中,我的 Item 对象将使用外键关联,因此将同时具有CategoryCategoryId属性,这些属性将自动保持同步。当我在 NHibernate 中尝试类似的操作时,由于尝试多次使用单个列,我得到了这个 SqlParameterCollection 错误的无效索引。

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

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

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

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

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

item.CategoryId = id;

我应该怎么做?

4

2 回答 2

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);
于 2012-11-08T18:14:33.620 回答
0

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

var dropdown = (DropDownList)MyFormView.FindControl("dropdown");
var id = dropdown.SelectedValue;
item.Category = new Category { CategoryId = id };
于 2012-11-08T11:49:35.500 回答