2013-03-12 97 views
0

我有兩個實體類(具有通用接口,以方便自動映射),其中,一個有一個通用的參考其它:映射ReferencesAny的反向嗎?

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列。

有沒有辦法設置這個映射,以便它「有效」?

回答

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 
+0

但是,如果您只是將訂單的附件添加到訂單的附件集,這不會不正確地保存嗎?它將保存沒有entity_type條目,這在使用GUID時會起作用,但會在其他方法中出現。否則,您將被減少爲手動分配反向連接,從而失敗了這一點。 – misnomer 2013-03-13 12:40:28

+0

反過來說明對方用referenceAny負責保存,然後把它放在正確的entity_type中。您必須將訂單分配給'AttachedTo',否則您的訂單有附件,但附件不知道訂單,您有一個損壞的模型。只需添加'void AddAttachment(附件a){Attachments.Add(a); a.AtchedTo = this; }到訂單類 – Firo 2013-03-13 13:06:23