Fluent Nhibernate 将集合映射到通用实体
Fluent Nhibernate map a collection to a generic entity
首先,抱歉我的英语不好。
我正在做一个项目,我必须将一些遗留 table 映射到新系统 运行 Nhibernate。
这个系统有一个共同的 table (DAT_DADO_EXTRA) 来存储客户提供的数据,使用一个键 (ENTIDADE_RELACIONADA) 来知道从什么 table 数据是相关的和一个 id (ID_ ENTIDADE_RELACIONADA) 以了解这与谁有关。
我在两个 tables/classes 上都抑制了额外的列以使示例简短
我的 classes 和地图如下:
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();
}
然后我得到了一个 class 名为 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) **????**;
}
我的问题是:知道我需要使用固定值 (RelatedEntityType) 加入此 tables,如何映射 Document 和 ExtraData 之间的关系?
说明关系的示例查询:
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");
// ...
}
}
首先,抱歉我的英语不好。
我正在做一个项目,我必须将一些遗留 table 映射到新系统 运行 Nhibernate。 这个系统有一个共同的 table (DAT_DADO_EXTRA) 来存储客户提供的数据,使用一个键 (ENTIDADE_RELACIONADA) 来知道从什么 table 数据是相关的和一个 id (ID_ ENTIDADE_RELACIONADA) 以了解这与谁有关。
我在两个 tables/classes 上都抑制了额外的列以使示例简短
我的 classes 和地图如下:
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();
}
然后我得到了一个 class 名为 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) **????**;
}
我的问题是:知道我需要使用固定值 (RelatedEntityType) 加入此 tables,如何映射 Document 和 ExtraData 之间的关系?
说明关系的示例查询:
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");
// ...
}
}