所以,我有两个表,称为User和Item。我希望每个用户能够标记(比如“盯着”Google世界中的东西)任何项目。
现在,从集合理论的角度来看,将其存储为用户和项目之间的简单关系应该是合理的。将此新表称为UserItemFlags。该表应该有两列;一个用户表的外键,另一个用于Item表的外键。如果用户U标记了项目I,则表示UserItemFlags表中存在行(U, I)
。
现在,我在Fluent-NHibernate中表达这个的问题是:我似乎无法理解如何处理Id
映射。理想情况下,我没有ID,因为除了用户和项目之间存在或不存在此关系之外,没有其他任何内容。这种模型的一个自然结果是表中不可能有重复的行。这是一个理想的功能。
using FluentNHibernate.Mapping;
public class UserItemFlagsMapping : ClassMap<UserItemFlags>
{
public UserItemFlagsMapping()
{
// Aaaa! I must have an Id!
References(x => x.User).Not.Nullable();
References(x => x.Item).Not.Nullable();
}
}
即使他们要求我放弃Fluent这个特定的情况,我也会为正确的指示感到高兴。
答案 0 :(得分:2)
你的意思是你没有身份证?您有一个具有用户ID和项目ID的复合ID。
编辑:答案在以下评论中:
Id()方法仅适用于单列主键。您想要使用CompositeId()。类似于以下内容:CompositeId()。KeyReference(x =&gt; x.User,“user_id”)。KeyReference(x =&gt; x.Item,“item_id”;显然,如果您使用的是默认约定映射,那么不需要列名。
答案 1 :(得分:1)
我还没有使用过Fluent NHibernate,但是标准的NHibernate通常不会像这样直接映射表。
多对多表只是在关系的两侧创建为集合。 所以你将拥有:
User.Items和Item.Users
向集合添加元素将在映射表UserItemFlags中创建行。
另见: http://marekblotny.blogspot.com/2009/02/fluent-nhbernate-and-collections.html
的Davide