Hi,

I have a class named Body; it has a property named Items, which is a set of 
BodyItem. I use NHibernate and Envers to persist that to the database and 
generate audit data.
When I try to persist an instance of Body which has only one BodyItem in 
Body.Items, everything works, and audit data is also recorded. But when I 
add two different items to Body.Items and try to persist it, an exception 
is throwed: 

NHibernate.NonUniqueObjectException: a different object with the same 
identifier value was already associated with the session: 
System.Collections.Generic.Dictionary`2[System.String,System.Object], of 
entity: ttbl_items_log

If I mark Body.Items with [NotAudited], then I can persist data normally, 
but (obviously) the audit data for the items is not recorded.

Can you please help me with that? Am I doing some mapping the wrong way? Or 
Envers simply can't audit this kind of relationship?

Those are simplified versions of the classes,. All of them can be found 
here: https://gist.github.com/jalexandretoledo/52146ba0cd0326e97b0d

[Audited]
public class Body
{
  public virtual Int32 Id { get; set; }
  public virtual String Name { get; set; }
 
  // [NotAudited]  <-- it will work if this is uncommented, but then I don't 
have audit data for Items
  public virtual ICG.ISet<BodyItem> Items { get; set; }
  public Body()
  { 
    Items = new ICG.HashedSet<BodyItem>();
  }
}


public class BodyItem
{
  public virtual DateTime Date { get; set; }
  public virtual Byte ByteValue { get; set; }
  public virtual Decimal DecimalValue { get; set; }

  ... 
}



This is how they are mapped:

internal class BodyMap : ClassMap<Body>
{
  internal BodyMap()
  {
    Table("ttbl_body");
    Id(x => x.Id).Column("id_body").GeneratedBy.Identity();
    Map(x => x.Name).Column("nm_body");
 
    HasMany(x => 
x.Items).Table("ttbl_items").KeyColumn("id_body_item").Component(
       m =>
       {
         m.Map(x => x.Date).Column("dt_item").Not.Nullable();
         m.Map(x => x.ByteValue).Column("nr_item").Not.Nullable();
         m.Map(x => x.DecimalValue).Column("vl_item").Not.Nullable();
       }
     ).Cascade.AllDeleteOrphan();
  }
}




Thanks in advance.

João

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/nhusers.
For more options, visit https://groups.google.com/d/optout.

Reply via email to