2009-10-27 69 views
1

我有一個分貝設置有3個表功能NHibernate傳承問題

t_DataItem 
pk id int auto 
isActive bit 0 
dateCreated datetime getdate() 
parentId int null 

t_User 
pk id int 
firstName varchar(50) 
lastName varchar(50) 

t_Email 
pk id int 
address varchar(50) 

所以現在我有3類,每一個代表相應的項目,但是User和電子郵件從DataItem的繼承。

public class DataItem 
    { 
     public virtual int Id { get; private set; } 
     public virtual DateTime DateCreated { get ; set; } 
     public virtual bool IsActive { get; set; } 
     public virtual DataItem Parent { get; set; } 

     public DataItem() 
     { 
      DateCreated = DateTime.Now; 
     } 
    } 


public class Email : DataItem 
    { 
     public virtual string Address { get; set; } 
    } 

public class User : DataItem 
    { 
     public virtual string FirstName { get; set; } 
     public virtual string LastName { get; set; } 

     public virtual IList<Email> Emails { get; private set; } 

     public User() 
     { 
      Emails = new List<Email>(); 
     } 

     public virtual void AddEmail(Email email) 
     { 
      Emails.Add(email); 
     } 
    } 

所以,當我保存用戶或電子郵件時,應先保存DataItem的記錄,通過它的id到的用戶或電子郵件ID(任何子類真的)。

我有一個部分的工作..我的問題就出在映射建立

的DataItem映射到在對應於電子郵件的用戶映射一個參考家長和的hasMany。

我不能讓它保存電子郵件,與它的DataItem的ParentId填寫到User.Id

所以,如果我有一個用戶記錄,我應該有一個相應的DataItem記錄

如果我有一個電子郵件記錄,我應該有一個相應的dataItem記錄,它的parentId設置爲用戶記錄ID的ID。

希望我解釋說,正確的...

是否有人可以告訴我的我將如何使用功能NHibernate映射了這一點的例子嗎?

我的映射如下

public class DataItemMap : ClassMap<DataItem> 
    { 
     public DataItemMap() 
     { 
      Table("t_DataItem"); 
      Id(map => map.Id); 
      Map(map => map.DateCreated).Nullable(); 
      Map(map => map.IsActive); 
      References(map => map.Parent).Column("parentid"); 
     } 
    } 

public class EmailMapping : SubclassMap<Email> 
    { 
     public EmailMapping() 
     { 
      Table("t_emails"); 
      KeyColumn("id"); 
      Map(email => email.Address); 
     } 
    } 

public class UserMapping : SubclassMap<User> 
    { 
     public UserMapping() 
     { 
      Table("t_Users"); 
      KeyColumn("id"); 
      Map(user => user.FirstName); 
      Map(user => user.LastName); 
      HasMany(user => user.Emails).KeyColumn("id").Cascade.All(); 
     } 
    } 

我喜歡它如何自動創建DataItem的記錄,並抓住它的ID,並將其存儲到我的用戶或電子郵件表..現在如果我能得到的最後一塊當我保存電子郵件時,不僅會保存dataitem記錄,而且還會填充殘留物,然後當我爲用戶提供電子郵件時,它會檢查用戶ID是否與加入時的父ID相符。

如果這個級別的繼承是不可能的,請讓我知道。

如果是這樣,你能否請我提供正確的教程或幫助糾正我的班級地圖?

謝謝!

回答

0

想通了

我不得不改變我的hasMany映射到包括DataItem的類型,以便它知道 從DataItem的表,而不是我的電子郵件表(拉場的parentId當字段不存在)

HasMany<DataItem>(user => user.Emails).KeyColumn("parentid").Cascade.All(); 

然後在我的User類的方法AddEmail改變

public virtual void AddEmail(Email email) 
{ 
    email.Parent = this; //forgot to set it's parent.. 
    Emails.Add(email); 
} 

真棒工具..很強大!