无法使用流畅的NHibernate映射配置包含外键列的复合主键

时间:2018-09-03 13:45:15

标签: c# .net nhibernate fluent-nhibernate fluent-nhibernate-mapping

我要做什么
我正在建模一个应用程序,人们(参与者)参与对话,每个人都有一个标签列表,这些标签定义了他们参与对话的原因。

示例
Alice是对话的参与者,她被标记为特定提交的作者,而Bob被标记为该提交的审阅者。

约束

  • 参与者有标签的集合
  • 没有双向关联,因此 Tags类不了解参与者(双向关联在域模型代码中更难管理)
  • 标记应保存在包含3个值(ParticipantId,EntityId,TypeId)的复合PK的单独表中

问题
我无法使用流畅的映射来配置NHibernate,以将ParticipantId列(也是FK)包括在“标签”表中作为复合PK的一部分。

为什么使用组合键而不替代自动增量身份?

  • Tags表预计将容纳大量数据,这将是 查询。

  • 标签表不应有重复的记录

因此,无论如何都应该在3个属性(ParticipantId,EnitityId,TagId)上创建唯一索引,那么为什么要重复数据呢?

为什么不简单地使用CompositeId()。KeyReference?
如上所述,我想避免双向关联。
在域模型中: ParticipantTag个集合。 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" />

0 个答案:

没有答案