映射ReferencesAny的反向?

时间:2013-03-12 17:53:07

标签: nhibernate fluent-nhibernate

我有两个实体类(具有通用接口,便于自动化),其中一个具有对另一个的通用引用:

public interface IModelClass
{
  Guid Id { get; set; }
}

class Order : IModelClass
{
  public virtual Guid Id { get; set; }
  public virtual ISet<Attachment> Attachments { get; set; }
}

class Attachment : IModelClass
{
  public virtual Guid Id { get; set; }
  public virtual IModelClass AttachedTo { get; set; }
}

我可以使用ReferencesAny定义通用引用:

mapping.ReferencesAny(x => x.AttachedTo)
       .EntityTypeColumn("entity_type")
       .EntityIdentifierColumn("entity_id")
       .IdentityType<Guid>()
       .MetaType<string>()
       .AddMetaValue<Order>("ORDER")
       .Cascade.None();

这样可以正常工作,只要我直接使用附件并且不尝试从Order方面做事。我想要的是映射关系的反向 - 即通常由以下方式处理:

mapping.HasMany(x => x.Attachments)

所以我可以说,我可以添加附件到订单的集合,并让它们持久化,而无需手动完成并设置/保存每个附件(我必须开始通过会话才能获得在同一交易中提交的附件)。这不起作用 - 它只是正常工作并在附件表上创建order_id列。

是否有某种方法可以设置此映射以使其“有效”?

1 个答案:

答案 0 :(得分:2)

mapping.HasMany(x => x.Attachments)
    .KeyColumn("entity_id")   // to give it the right column to use
    .Where("entity_type = 'ORDER'")  // makes sure that only attachments for the order are loaded
    .Inverse()
    .Cascade.AllDeleteOrphan(); // or .Cascade.All(); if Attachments should stay without