【发布时间】:2010-10-21 00:22:34
【问题描述】:
我正在使用 NHibernate 将我的 Item 类持久化到 SQL 数据库。 Item 类具有 Item.Tags 类型的 ICollection<Tag> 属性,我使用以下 NHibernate 配置对其进行映射。
<set name="Tags" table="TagLinks" cascade="all" lazy ="false">
<key column="ItemId" />
<many-to-many class="Tag" column="TagID" />
</set>
这也是我的 Tag 类的映射,它只有一个 int ID 和一个字符串名称。
<class name="RCL.Tag" table="Tags" lazy="false" >
<id name ="TagID" column="TagID" >
<generator class="native"/>
</id>
<property name="Name" not-null="true"/>
</class>
这一切都很好,但它允许创建具有相同名称的重复标签。因此,下面的代码将在 Tags 表中创建三个单独的“foo”条目,它们都具有单独的 ID。
myItem1.Tags.Add(new Tag("Foo"));
myItem2.Tags.Add(new Tag("Foo"));
myItem3.Tags.Add(new Tag("Foo"));
这显然不是我想要的工作方式。我可以向 Tags.Name 列添加唯一约束,但上面的代码只会引发异常。
在对象模型方面,我希望能够通过编辑Tag 或String 的集合来简单地从Item 添加和删除标签。但是,当我的项目被持久化到数据库时,它应该确定需要创建哪些新标签以及何时应该映射到标签表中的现有条目。
我还考虑将其更改为基于值的一对多关系,其中Item.Tags 将只是一个IList<String>,并将映射到单个标签表,其中每个Item 上的每个单独标签都有条目.这也可以,但我想我更喜欢第一个,因为它可以更有效地查找具有特定标签的项目。我对关系数据库也很陌生。所以我什至不确定这是否应该是一个问题。
【问题讨论】:
-
我很好奇为什么你真的希望这是一个数据库解决方案?
-
我不确定我是否理解您的评论。数据库解决方案的替代方案是什么?
标签: c# .net nhibernate nhibernate-mapping