2009-10-27 7 views
1

J'ai une configuration db avec 3 tablesNHibernate Héritage Courant d'émission

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) 

maintenant j'ai 3 classes, chacune représentant l'élément respectif, mais l'utilisateur et de DataItem Email hériteront.

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); 
     } 
    } 

Alors, quand je sauverai un utilisateur ou e-mail, il devrait enregistrer un record dataitem premier, en passant, il est id à l'id d'utilisateur ou e-mail (toute sous-classe vraiment).

J'ai que le travail de la partie .. mon problème réside dans la mise en correspondance pour la mise en place du

DataItem Mapping d'avoir une référence au parent, et le hasMany dans le usermap qui correspond aux e-mails.

Je ne peux pas l'obtenir pour enregistrer le courrier électronique, avec elle est DataItem ParentId rempli au User.Id

Donc, si j'avais un enregistrement de l'utilisateur, je devrais avoir un correspondant dataitem enregistrement

si J'avais un enregistrement d'email, je devrais avoir un enregistrement de dataItem correspondant avec son parentId mis à l'id de l'identification d'enregistrement d'utilisateur.

Espérons que je l'ai expliqué ce droit ...

Quelqu'un peut-il s'il vous plaît me montrer un exemple de la façon dont je la carte à l'aide de cette Fluent NHibernate?

Mes correspondances sont les suivantes

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(); 
     } 
    } 

J'aime la façon dont il auto crée l'enregistrement DataItem et saisit son identifiant et le stocke dans mon utilisateur ou d'une table e-mail .. maintenant si je pouvais obtenir le dernier morceau de la Le puzzle a trouvé où, quand j'enregistre un email, non seulement il enregistre l'enregistrement de dataitem, mais remplit le parentid, et puis quand je tire les email pour un utilisateur, il vérifie l'identification d'utilisateur contre l'identification de parent sur la jointure.

Si ce niveau d'héritage n'est pas possible, faites le moi savoir.

si c'est le cas, pourriez-vous s'il vous plaît me fournir le bon tutoriel ou aide en corrigeant mes cartes de classe?

merci!

Répondre

0

figured it out

je devais changer ma carte hasMany pour inclure le type DataItem afin qu'il savait de tirer le parentId de champ de la table DataItem au lieu de ma table de courrier électronique (où le champ n'existe pas)

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

puis dans ma classe utilisateur changer la méthode AddEmail à

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

outil génial .. très puissant!

Questions connexes