我是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,因此会同时拥有Category
和CategoryId
属性,这些属性会自动保持同步。当我在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;
我该怎么做?
答案 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 };