2

实体

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

产品有一个类别,NHibernate 很乐意为我填充。

数据库

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

设想

用户编辑此产品(通过网络界面)并选择不同的类别(例如,我们选择“蔬菜”而不是“鱼”)。

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

问题

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

所以我们检索现有的产品,现在问题来了。

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

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

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

a) 将 CategoryID 属性添加到 Product

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

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

d) 完全做其他事情!

4

3 回答 3

4

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

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

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

Session.SaveOrUpdate(product);

我只是做了一些测试,它似乎并没有拉回整个类别。

于 2009-11-19T18:22:47.347 回答
2

更新: Session.Load 是正确答案

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

session.Save(product);
于 2009-11-19T22:34:58.687 回答
0

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

于 2009-11-19T17:51:38.410 回答