2010-09-14 8 views
1

Ma demande a les entités suivantes:NHibernate Audit - postInsert ne fonctionne pas

public class User 
{ 
    public virtual int UserID { get; set; } 
    public virtual string UserName { get; set; } 
    public virtual IList<UserLog> Log { get; private set; } 

    public User() 
    { 
     Log = new List<UserLog>(); 
    } 
} 

public class UserLog 
{ 
    public virtual int UserLogID { get; set; } 
    public virtual User User { get; set; } 
    public virtual string UserName { get; set; } 
    public virtual DateTime DateCreated { get; set; } 
} 

Avec les applications couramment suivantes:

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Table("Users"); 
     Id(x => x.UserID); 
     Map(x => x.UserName); 
     HasMany(x => x.Log) 
      .KeyColumn("UserID") 
      .OrderBy("DateCreated") 
      .Inverse() 
      .Cascade.All(); 
    } 
} 

public class UserLogMap : ClassMap<UserLog> 
{ 
    public UserLogMap() 
    { 
     Table("UsersLog"); 
     Id(x => x.UserLogID); 
     References(x => x.User, "UserID"); 
     Map(x => x.UserName); 
     Map(x => x.DateCreated); 
    } 
} 

Le tableau UsersLog journaux simplement les modifications qui sont apportées à l'utilisateur. J'essaye de raccorder ceci automatiquement en utilisant les écouteurs d'événement de NHibernate. J'ai installé ma configuration qui appelle avec succès les 2 méthodes suivantes:

public void OnPostInsert(PostInsertEvent @event) 
{ 
    if (@event.Entity is User) 
     InsertLog(@event.Entity); 
} 

public void OnPostUpdate(PostUpdateEvent @event) 
{ 
    if (@event.Entity is User) 
     InsertLog(@event.Entity); 
} 

Modifier (ici est la méthode InsertLog):

private void InsertLog(object entity) 
{ 
    var context = ServiceLocator.Current.GetInstance<IDataContext>(); 
    var user = (User)entity; 
    context.Repository<UserLog>().Insert(new UserLog 
    { 
     User = user, 
     UserName = user.UserName, 
     DateCreated = DateTime.UtcNow 
    }); // Insert calls ISession.SaveOrUpdate(entity) 
} 

Lorsque je mettre à jour un enregistrement est inséré avec succès un journal, mais lors de l'insertion un enregistrement que j'obtiens une erreur me disant que le UserID ne peut pas être nul dans la table UsersLog. J'ai joué avec quelques variations différentes mais rien ne semble fonctionner.

Je serais vraiment reconnaissant si quelqu'un pouvait me montrer comment cela peut être fait. Merci

+0

Pouvez-vous publier le code pour la méthode InsertLog()? – DanP

+0

Bonjour, j'ai mis à jour mon message avec la méthode InsertLog. Il saisit essentiellement mon contexte de données (qui est un wrapper autour de la session NHibernate) et insère dans le référentiel. Note: J'ai dû utiliser le ServiceLocator et non l'injection du constructeur car j'avais un problème de référence circulaire lors de la configuration du contexte de données et de l'écouteur d'événement nhibernate. – nfplee

+0

Est-ce que PK est autoincrément? Si c'est comment NH aurait la valeur pour cela? – epitka

Répondre

5

Solution postée dans les commentaires de la question. Je devais simplement utiliser:

@event.Session.GetSession(NHibernate.EntityMode.Poco).Save(...); 

pour enregistrer l'utilisateur au lieu d'accéder au référentiel.

+1

J'ai remarqué que mes modifications ne persistaient pas. Appeler explicitement Flush() aidé comme mentionné dans le post DanP posté. http://groups.google.com/group/nhusers/msg/1b09a4f1583da646 –

+0

Quel est le but de la méthode GetSession? Cela a résolu mon problème, mais je ne sais pas exactement pourquoi .. –

+0

Je ne suis pas sûr de vous dire la vérité. Je viens d'accepter que ça a marché. – nfplee