存储没有显式ID的简单关系

时间:2011-01-20 10:32:43

标签: c# nhibernate fluent-nhibernate

所以,我有两个表,称为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这个特定的情况,我也会为正确的指示感到高兴。

2 个答案:

答案 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