C# 存储没有显式ID的简单关系
所以,我有两个表,称它们为User和Item。我希望每个用户都能够标记(比如谷歌世界中的“凝视”事物)任何项目 现在,从集合论的角度来看,将其存储为用户和项目之间的简单关系应该是合理的。调用这个新表UserItemFlags。该表应该有两列;一个具有用户表的外键,另一个具有项目表的外键。如果用户U标记项I,那么这将由useritemlagas表中的行C# 存储没有显式ID的简单关系,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,所以,我有两个表,称它们为User和Item。我希望每个用户都能够标记(比如谷歌世界中的“凝视”事物)任何项目 现在,从集合论的角度来看,将其存储为用户和项目之间的简单关系应该是合理的。调用这个新表UserItemFlags。该表应该有两列;一个具有用户表的外键,另一个具有项目表的外键。如果用户U标记项I,那么这将由useritemlagas表中的行(U,I)表示 现在,我用Fluent NHibernate表达这个的问题是:我似乎不明白如何处理Id映射。理想情况下,我将没有ID,因为除了用户和
(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();
}
}
使用FluentNHibernate.Mapping;
公共类UserItemFlagsMapping:ClassMap
{
公共UserItemFlagsMapping()
{
//啊!我必须有身份证!
引用(x=>x.User).Not.Nullable();
引用(x=>x.Item).Not.Nullable();
}
}
我很乐意看到任何指向正确方向的指针,即使它们会要求我在这个特定情况下放弃Fluent。我还没有使用Fluent NHibernate,但对于标准NHibernate,我通常不会像这样直接映射表 多对多表只是作为关系两侧的集合创建的。 因此,您将有: User.Items和Item.Users 向集合中添加元素将在映射表UserItemFlags中创建行 另见:
大卫你没有身份证是什么意思?您有一个用户ID和项目ID的复合ID
编辑:答案如下: Id()方法仅适用于单列主键。您希望改为使用CompositeId()。类似于以下内容:CompositeId().KeyReference(x=>x.User,“User_id”).KeyReference(x=>x.Item,“Item_id”;显然,如果使用默认约定映射,则不需要列名
啊,很公平。但是,我想避免在这些类中使用列表,因为它与我使用数据的方式根本不匹配:(是的,我同意。但是Fluent NHibernate不同意。我需要调用
ClassMap
上的Id
-方法让Fluent理解它。Id()方法仅适用于单列主键。您希望改为使用CompositeId()。类似于以下内容:CompositeId().KeyReference(x=>x.User,“User\u id”).KeyReference(x=>x.Item,“Item\u id”;显然,如果使用默认约定映射,则不需要列名。