我要做什么
我正在建模一个应用程序,人们(参与者)参与对话,每个人都有一个标签列表,这些标签定义了他们参与对话的原因。
示例
Alice是对话的参与者,她被标记为特定提交的作者,而Bob被标记为该提交的审阅者。
约束
问题
我无法使用流畅的映射来配置NHibernate,以将ParticipantId列(也是FK)包括在“标签”表中作为复合PK的一部分。
为什么使用组合键而不替代自动增量身份?
Tags表预计将容纳大量数据,这将是 查询。
标签表不应有重复的记录
因此,无论如何都应该在3个属性(ParticipantId,EnitityId,TagId)上创建唯一索引,那么为什么要重复数据呢?
为什么不简单地使用CompositeId()。KeyReference?
如上所述,我想避免双向关联。
在域模型中:
Participant
有Tag
个集合。
Tag
位用户不了解Participant
。
因此,Tag
类甚至没有Participant
属性,因此无法在KeyReference
中使用。
实体如下所示
public class Participant : IEquatable<Participant>
{
private int _id;
private IList<Tag> _tags = new List<Tag>();
public virtual int Id => _id;
public virtual IReadOnlyCollection<Tag> Tags => new ReadOnlyCollection<Tag>(_tags);
// omitted for brevity
}
public class Tag : IEquatable<Tag>
{
private byte _typeId;
private int _entityId;
public virtual byte TypeId => _typeId;
public virtual int EntityId => _entityId;
// omitted for brevity
}
这是流利的贴图
public class ParticipantMapping : ClassMap<Participant>
{
public ParticipantMapping()
{
Id(x => x.Id);
HasMany(x => x.Tags);
}
}
public class TagMapping : ClassMap<Tag>
{
public TagMapping()
{
CompositeId()
.KeyProperty(x => x.EntityId)
.KeyProperty(x => x.TypeId);
//.KeyReference(x => x.Participant);
}
}
当我使用NHibernate映射生成模式时,我得到以下信息,该信息作为复合PK的一部分缺少ParticipantId
CREATE TABLE [dbo].[Tags](
[EntityId] [int] NOT NULL,
[TypeId] [tinyint] NOT NULL,
[ParticipantId] [int] NULL,
PRIMARY KEY CLUSTERED
(
[EntityId] ASC,
[TypeId] ASC,
-- MISSING THIS : [ParticipantId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Tags] WITH CHECK ADD CONSTRAINT [FK2B61AAB3E2880CD5] FOREIGN KEY([ParticipantId])
REFERENCES [dbo].[Participants] ([Id])
GO
ALTER TABLE [dbo].[Tags] CHECK CONSTRAINT [FK2B61AAB3E2880CD5]
GO
我正在使用FluentNhibernate v 2.1.2
<PackageReference Include="FluentNHibernate" Version="2.1.2" />