2011-01-20 15 views
3

所以,我有两个表,称它们为User和Item。我希望每个用户都能够标记任何项目(例如在Google Universe中“凝视”的内容)。现在存储一个简单的关系,没有明确的ID

,从集合论的角度来看,它应该是合理的存储这个用户和项目之间的简单关系。调用这个新的表UserItemFlags。该表应该有两列;一个是用户表的外键,另一个是外键到Item表。如果用户U标记项目I,则表示该项目在UserItemFlags表中存在行(U, I)。现在

,我用流利,NHibernate的表达这个问题是这样的:我似乎无法理解与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

你什么意思,你没有一个ID?您的用户ID和商品ID都有复合ID。


编辑:答案是在此评论:

的ID()方法只是针对单个列主键。你想用CompositeId()来代替。如下所示:CompositeId()。KeyReference(x => x.User,“user_id”)。KeyReference(x => x.Item,“item_id”;显然,如果使用默认约定映射,吨需要的列名。

+0

是的,我同意。但是流利,NHibernate的不同意。我需要调用`Id`法上`类映射<...>`的良好理解。 – 2011-01-21 09:27:46

1

我没有尚未使用功能NHibernate但与标准的NHibernate我通常不会直接映射表是这样的。

许多一对多表刚创建集合上关系的两个侧面。 所以,你将有:

User.Items和Item.Users

添加元素添加到集合将创建映射表UserItemFlags内行。

参见: http://marekblotny.blogspot.com/2009/02/fluent-nhbernate-and-collections.html

达维德

+0

啊,够公平的。但是,我想,以避免在这些类的列表,因为它没有我会在所有:(使用数据的方式匹配 – 2011-01-20 11:26:22

相关问题