存储简单关系时无需显式ID

3
所以,我有两个表,称之为User和Item。我希望每个用户都能够标记(类似于在Google宇宙中“关注”事物)任何项目。
现在,从集合论的角度来看,将其存储为用户和项目之间的简单关系应该是合理的。将此新表称为UserItemFlags。该表应该有两列;一个用于User表的外键,另一个用于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个回答

2
你说你没有ID?其实你的组合ID已经包含了用户ID和物品ID。
编辑:答案在以下评论中:

Id()方法只适用于单列主键。你需要使用CompositeId()。像下面这样:CompositeId().KeyReference(x => x.User, "user_id").KeyReference(x => x.Item, "item_id")。如果你正在使用默认约定映射,则不需要列名。


是的,我同意。但Fluent-NHibernate并不赞同。我需要在Fluent中调用Id方法来让它理解。 - Magnus Hoff
2
Id()方法仅适用于单列主键。您应该使用CompositeId()方法。例如:CompositeId().KeyReference(x => x.User, "user_id").KeyReference(x => x.Item, "item_id")。显然,如果您正在使用默认约定映射,则不需要列名。 - Rich

1

啊,好的。不过,我想避免在这些类中使用列表,因为它根本不符合我将要使用数据的方式 :( - Magnus Hoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接