NHibernate更新参考

时间:2009-11-19 17:41:19

标签: nhibernate orm saving-data

实体

我们有一个名为Product的实体,它使用NHibernate加载。

产品有一个NHibernate愉快地为我填充的类别。

数据库

在数据库中,Product有一个类别的外键。

方案

用户编辑此产品(通过网络界面)并选择其他类别(比如说“Fish”,我们选择“Veg”)。

这可能是一个下拉列表,显示了每个类别。当他们选择不同的类别时,我们会得到一个int键。

问题

显然我们现在想要将更改保存到Product,但实际上唯一的变化是保存一个新的int(比如2,而不是1)。

因此我们检索现有产品,现在出现了问题。

我们在Product上没有“CategoryID”字段,我们只有Category属性。

但我们并不真的想要检索类别(通过id)只是为了将它分配给产品。

所以我想我想知道的是我们应该......

a)向Product

添加CategoryID属性

b)创建一个新类别,为其分配相关的ID并将其附加到Product(但肯定会导致错误或覆盖现有类别)

c)从系统中检索(查找)类别(按ID)并将其附加到产品

d)完全做其他事情!

3 个答案:

答案 0 :(得分:4)

看起来您可以使用Session.Load(id)功能。

Session.Load是一种特殊方法,它返回带有ID的代理,直到您请求加载的另一个属性为止。如果没有与ID匹配的项目,则会引发错误。尝试类似:

product.Category = Session.Load<Category>(2); //2 being the new category ID

Session.SaveOrUpdate(product);

我刚刚进行了一些测试,似乎没有取消整个类别。

答案 1 :(得分:2)

更新:Session.Load是correct answer

product.Category = session.Load<Category>(2);

session.Save(product);

答案 2 :(得分:0)

使用NH的EnumStringType<T>将您的类别作为枚举映射到相应的数据库值(可以是字符串或数字)。如果你谷歌的话,你会发现很多用法例子。

HTH!