2009-10-27 42 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); 
} 

真棒工具..很强大!