我有两个实体类(具有通用接口,便于自动化),其中一个具有对另一个的通用引用:
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
列。
是否有某种方法可以设置此映射以使其“有效”?
答案 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