Fluent Nhibernate将集合映射到通用实体

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fluent Nhibernate将集合映射到通用实体相关的知识,希望对你有一定的参考价值。

首先,抱歉我的英语不好。

我正在开发一个项目,我需要使用运行Nhibernate的新系统映射一些旧表。该系统有一个公共表(DAT_DADO_EXTRA)来存储客户提供的数据,使用密钥(ENTIDADE_RELACIONADA)知道哪些表数据是相关的,以及ID(ID_ENTIDADE_RELACIONADA)知道这与谁有关。

我在两个表/类上抑制了额外的列以使示例简短

我的课程和地图如下:

public class ExtraData : Entity
{
    public ExtraData()
    {
    }

    /// <inheritdoc />
    public ExtraData(string key, IRobotRunEntry runEntry) : base(key, runEntry)
    {
    }

    public virtual string DataDescription { get; set; }
    public virtual int RelatedEntityId { get; set; }
    public virtual string RelatedEntityType { get; set; }
    public virtual string Value { get; set; }
}

和地图

    public ExtractDataMap() : EntityMap<ExtraData>
    {
        Table("DAT_DADO_COMPLEMENTAR");

        Map(p => p.RelatedEntityId).Column("ID_ENTIDADE_RELACIONADA").Not.Nullable();
        Map(p => p.RelatedEntityType).Column("ENTIDADE_RELACIONADA").Not.Nullable();
        Map(p => p.DataDescription).Column("DESCRICAO").Not.Nullable();
        Map(p => p.Value).Column("VALOR").Not.Nullable();
    }

然后我得到了一个名为Document的类

public class Document : Entity
{
    /// <inheritdoc />
    public Document()
    {
        ExtraData = new HashSet<ExtraData>();
    }

    /// <inheritdoc />
    public Document(string key, IRobotRunEntry runEntry) : base(key, runEntry)
    {

        ExtraDataList = new HashSet<ExtraData>();
    }
    public virtual ISet<ExtraData> ExtraDataList { get; set; }
}

和地图

    public DocumentMap() : EntityMap<ExtraData>
    {
        Table("DAT_DOCUMENTO_RC");

        Map(p => p.Code).Column("CODIGO").Nullable();
        Map(p => p.BeneficiaryUnityCode).Column("CODIGO_UNIDADE_BENEFICIARIO");
        Map(p => p.BeneficiaryCardCode).Column("CARTEIRA_BENEFICIARIO");
        References(p => p.Beneficiary).Column("ID_BENEFICIARIO").Nullable().Index("IDX_DOCUMENTO_RC_BENEFICIARIO");
        HasMany(p => p.Services).Cascade.AllDeleteOrphan().Fetch.Select().LazyLoad();
        HasMany(p => p.ExtraData) **????**;
    }

我的问题是:我如何映射Document和ExtraData之间的关系知道我需要使用固定值(RelatedEntityType)来连接这个表?

用于说明关系的示例查询:

                    session.Query<ExtraData>()
                    .Where(p => p.RelatedEntityType == "DOCUMENTO"
                                && p.RelatedEntityId == 95)
                    .ToList();

再次,抱歉我可怜的英语:)

答案

您应该能够在HasMany映射上使用“Where”来实现此过滤。这是我的意思的一个例子:

public class DocumentMap : ClassMap<Document>
{
    public DocumentMap()
    {
        // ...
        HasMany(p => p.ExtraData)
            .Where(x => x.RelatedEntityType == "DOCUMENTO");

       // ...
     }
}

以上是关于Fluent Nhibernate将集合映射到通用实体的主要内容,如果未能解决你的问题,请参考以下文章

使用 Fluent NHibernate 有条件地将两列映射到一个字段

如何在Fluent NHibernate中映射受保护的集合?

使用 Fluent NHibernate 和 NHibernate 3 将枚举映射为 Int

使用 Fluent NHibernate 将每个层次结构映射到现有数据库的表,没有鉴别器列

Fluent NHibernate 实体 HasMany 不同子类类型的集合

Fluent NHibernate:如何将整个类映射为只读?