2010-10-22 2 views
1

привет, я новичок в nhibernate, и я прочитал много потоков с похожими проблемами, но я не получаю его работу. Я использую оракул, nhibernate3 альфа и свободный nhibernate для сопоставления. У меня есть родительское дочернее отношение. дочерняя таблица имеет составной идентификатор. Работы по выбору, вставке, обновлению записей. Удаление родителя без дочерних записей. Но удаление родителя с дочерними элементами или просто удалите ребенка выбрасывает исключение KeyNotFoundException. кажется, что я что-то пропустил в своем картографировании?HasMany вызывает KeyNotFoundException при удалении

StackTrace

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

    }