2009-11-19 88 views
2

实体NHibernate的更新参考

我们有一个实体,它使用NHibernate加载称为产品。

产品有一个类别,NHibernate很高兴为我填充。

数据库

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

方案

用户编辑该产品(通过网络接口),并选择不同的类别(说的不是“鱼”,我们选择“素食”)。

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

问题

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

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

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

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

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

一)一个类别id属性添加到产品

B)创建一个新的类别,分配给它的相关标识,并附上对产品(但肯定会导致错误,或覆盖现有类别)

C)检索(查找)从系统(由ID类),并附上商品

d)做别的东西完全!

回答

2

更新:Session.Load是correct answer

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

session.Save(product); 
+0

是的,似乎工作。 我只有一个可以为空的日期时间字段,我需要确保我的映射和模型反映的事实,它可以为空(否则NHibernate抛出一个关于无效日期时间值的错误) – 2009-11-20 11:47:49

+0

但该可空的日期是在产品(不是类别)对不对? – dotjoe 2009-11-20 14:23:43

+0

+1我又回来了。 :) – Dusty 2009-12-07 19:38:40

0

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

HTH!

4

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

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

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

Session.SaveOrUpdate(product); 

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

+0

现在我不知道该做哪种方式...我使用当我更新现有实体负荷,但也应该为每个参考使用Load? hmmm – dotjoe 2009-11-20 15:46:03

+1

NHibernate中的一个很好的规则是使Identity列的setter变为private或protected。这不会允许您像在答案中那样分配ID。查看SharpArchitecture以获得良好的实施,以及如何在测试中修改Id。 如前所述,除非需要属性,否则Session.Load不会对数据库执行任何操作,所以我们基本上只是在做出与您的答案相同的事情,而只需要一个能够在需要时自行解析的智能对象。 – 2009-11-20 18:44:21

+0

优秀点 – dotjoe 2009-11-23 14:32:00