2010-10-22 116 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; 
     } 

    }