2011-03-10 61 views
0

對不起,如果我沒有任何意義,我的大腦現在炒。我只是在NHibernate的開始編程,決定搬到流利NHibernate的,因爲自動映射的,但我有一個小麻煩,這裏是關係應該具有:流利NHibernate atutomapping,簡單的問題,額外的領域被添加爲外鍵關係

enter image description here

這裏是關係流利NHibernate的自動映射請注意MemberId被添加到表中: enter image description here

我猜這是因爲在我的約定中關係設置爲反轉。我需要使關係反轉()或級聯不起作用。這裏是我的約定:

public class HasManyConvention : IHasManyConvention 
    { 
     public void Apply(FluentNHibernate.Conventions.Instances.IOneToManyCollectionInstance instance) 
     { 
      instance.Key.Column(instance.EntityType.Name + "ID"); 
      //instance.Inverse(); 
      if (instance.Member.GetCustomAttributes(typeof(CascadeAttribute), false).Length <= 0) 
      { 
       instance.Cascade.None(); 
       return; 
      } 
      var cascadeOption = (CascadeAttribute)instance.Member.GetCustomAttributes(typeof(CascadeAttribute), false)[0]; 
      switch (cascadeOption.CascadeOption) 
      { 
       case Enums.CascadeOptions.All: 
        instance.Cascade.All(); 
        break; 

       case Enums.CascadeOptions.AllDeleteOrphan: 
        instance.Cascade.AllDeleteOrphan(); 
        break; 

       case Enums.CascadeOptions.Delete: 
        instance.Cascade.All(); 
        break; 

       case Enums.CascadeOptions.DeleteOrphan: 
        instance.Cascade.DeleteOrphan(); 
        break; 


       case Enums.CascadeOptions.None: 
        instance.Cascade.None(); 
        break; 

       case Enums.CascadeOptions.SaveUpdate: 
        instance.Cascade.SaveUpdate(); 
        break; 
      } 

     } 
    } 



public class ReferenceConvention : IReferenceConvention 
    { 
     public void Apply(FluentNHibernate.Conventions.Instances.IManyToOneInstance instance) 
     { 
      instance.Column(instance.Property.Name + "Fk"); 
      if (Attribute.IsDefined(instance.Property.PropertyType.Assembly, typeof(DomainSignatureAttribute))) 
       instance.UniqueKey("DomainSignature"); 
      else 
       instance.Index(instance.Property.Name + "Index"); 
     } 
    } 

和我的兩個實體:

public class Member : Entity 
    { 
     public Member() 
     { 

      Mail = new List<Mail>(); 
     } 


     [Cascade(Enums.CascadeOptions.All)] 
     public virtual IList<Mail> Mail 
     { 
      get; set; 
     } 



    } 


public class Mail : Entity 
    { 

     public virtual Member Receiver 
     { 
      get; set; 
     } 

     public virtual Member Sender 
     { 
      get; set; 
     } 

     public virtual string Subject 
     { 
      get; 
      set; 
     } 

     public virtual string Body 
     { 
      get; set; 
     } 
    } 

爲什麼功能NHibernate地圖成員Id時,很明顯,接收器和發送器之間的外鍵的成員表?

回答

1

因爲Member.Mail被映射爲一對多導致Mail中的外鍵。沒有人會說'Member.Mail'是一個反向關係,沒有人說過如何調用外鍵。所以它創建了一個標準的外鍵。

+0

@Eitan,他意味着你從來沒有指定如何映射這種關係,所以它只是假定一個標準的外鍵,它按照慣例稱爲MemberId。 – Vadim 2011-03-10 15:21:08

+0

@Eitan:反意味着關係對另一個而言是多餘的,不需要存儲。它不會更改數據庫模型,但如果您想要雙向引用,則應該使用inverse。 – 2011-03-10 15:24:43