2010-10-22 114 views
1

嗨,我是新来的nhibernate,我读了很多有类似问题的线程,但我没有得到它的工作。 我使用oracle,nhibernate3 alpha和流畅的nhibernate进行映射。我有一个父母的孩子关系。子表有一个复合ID。选择,插入,更新记录的作品。删除没有子记录的父项。但删除家长与子女只是删除一个孩子抛出一个KeyNotFoundException。看起来我错过了我的映射中的某些东西?HasMany导致KeyNotFoundException在删除

堆栈跟踪

bei System.Collections.Generic.Dictionary`2.get_Item(TKey key) 
bei NHibernate.Engine.StatefulPersistenceContext.RemoveEntity(EntityKey key) in d:\CSharp\NH\nhibernate\src\NHibernate\Engine\StatefulPersistenceContext.cs:Zeile 434. 
bei NHibernate.Action.EntityDeleteAction.Execute() in d:\CSharp\NH\nhibernate\src\NHibernate\Action\EntityDeleteAction.cs:Zeile 86. 
bei NHibernate.Engine.ActionQueue.Execute(IExecutable executable) in d:\CSharp\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:Zeile 130. 
bei NHibernate.Engine.ActionQueue.ExecuteActions(IList list) in d:\CSharp\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:Zeile 113. 
bei NHibernate.Engine.ActionQueue.ExecuteActions() in d:\CSharp\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:Zeile 151. 
bei NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) in d:\CSharp\NH\nhibernate\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs:Zeile 241. 
bei NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) in d:\CSharp\NH\nhibernate\src\NHibernate\Event\Default\DefaultFlushEventListener.cs:Zeile 19. 
bei NHibernate.Impl.SessionImpl.Flush() in d:\CSharp\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:Zeile 1524. 
bei NHibernate.Transaction.AdoTransaction.Commit() in d:\CSharp\NH\nhibernate\src\NHibernate\Transaction\AdoTransaction.cs:Zeile 187. 
bei LFF.Kabu.Win.Tabellenverwaltung.DataAccess.NHibernate.UnitOfWork.CommitTransaction() in C:\Demos\Tabellenverwaltung\DataAccess.NHibernate\UnitOfWork.cs:Zeile 77. 
bei LFF.Kabu.Win.TabModul.DruckUndVersand.ViewModel.DruckUndVersandVM.SaveData() 

我的实体类和映射如下:

public class DruckUndVersand 
{ 
    public DruckUndVersand() 
    { 
     this.RefFilters = new List<RefDruckUndVersandFilter>(); 
    } 

    public virtual long Id { get; set; } 
    public virtual string Programm { get; set; } 
    public virtual string Variante { get; set; } 
    public virtual string Beschreibung { get; set; } 
    public virtual bool IsActive { get; set; } 
    public virtual IList<RefDruckUndVersandFilter> RefFilters { get; set; } 
} 

public class RefDruckUndVersandFilter 
{ 
    public virtual DruckUndVersand DruckUndVersand { get; set; } 
    public virtual long Rank { get; set; } 
    public virtual string Filter { get; set; } 

    #region override Equals(), GetHashCode() 
    // 
    #endregion 
} 

我流利的映射是这样的:

public class DruckUndVersandMapper : ClassMap<DruckUndVersand> 
{ 
    public DruckUndVersandMapper() 
    { 
     Table("Tab_DruckUndVersand"); 
     Id(x => x.Id, "ID") 
      .GeneratedBy.Sequence("SEQ_DruckUndVersand"); 

     Map(x => x.Programm).Not.Nullable().Length(255); 
     Map(x => x.Variante).Length(255); 
     Map(x => x.Beschreibung).Length(255); 
     Map(x => x.IsActive).Column("ISACTIVE").CustomType<YesNoType>().Length(1); 

     HasMany(x => x.RefFilters) 
      .KeyColumn("IDDruckUndVersand") 
      .NotFound.Ignore() 
      .Inverse() 
      .Cascade.All() 
      ; 
    } 
} 

public class RefDruckUndVersandFilterMapper : ClassMap<RefDruckUndVersandFilter> 
{ 
    public RefDruckUndVersandFilterMapper() 
    { 
     Table("REFDruckUndVersandFILTER"); 

     Not.LazyLoad(); 

     Map(x => x.Filter); 

     CompositeId() 
      .KeyReference(x => x.DruckUndVersand, "IDDruckUndVersand") 
      .KeyProperty(x => x.Rank, "FILTERRANK"); 

    } 
} 

回答

0

我得到它现在的工作。问题是我的重写Equals()和GetHashCode()。

public override bool Equals(object obj) 
    { 
     var toCompare = obj as RefDruckUndVersandFilter; 

     if (toCompare == null) 
      return false; 

     if (!GetType().Equals(toCompare.GetActualType())) 
      return false; 

     if (ReferenceEquals(this, toCompare)) 
      return true; 

     return DruckUndVersand == toCompare.DruckUndVersand 
       && Rank == toCompare.Rank 
       //&& Filter == toCompare.Filter //old causes the error 
       ; 
    } 

    protected virtual Type GetActualType() 
    { 
     return GetType(); 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      var hashcode = GetType().GetHashCode(); 

      hashcode = (hashcode * 31)^(DruckUndVersand != null ? DruckUndVersand.GetHashCode() : 0); 
      hashcode = (hashcode * 31)^Rank.GetHashCode(); 
      //hashcode = (hashcode * 31)^(Filter!= null ? Filter.GetHashCode() : 0); old 

      return hashcode; 
     } 

    }