删除时NHibernate KeyNotFoundException

删除时NHibernate KeyNotFoundException,nhibernate,Nhibernate,当我试图删除一个具有多对一复合键的对象时,NHibernate正在抛出和异常。保存对象可以正常工作。例外情况如下: [KeyNotFoundException: The given key was not present in the dictionary.] System.ThrowHelper.ThrowKeyNotFoundException() +28 System.Collections.Generic.Dictionary`2.get_Item(TKey key) +7455516

当我试图删除一个具有多对一复合键的对象时,NHibernate正在抛出和异常。保存对象可以正常工作。例外情况如下:

[KeyNotFoundException: The given key was not present in the dictionary.]
System.ThrowHelper.ThrowKeyNotFoundException() +28
System.Collections.Generic.Dictionary`2.get_Item(TKey key) +7455516
NHibernate.Engine.StatefulPersistenceContext.RemoveEntity(EntityKey key) in d:\CSharp\NH\nhibernate\src\NHibernate\Engine\StatefulPersistenceContext.cs:434
NHibernate.Action.EntityDeleteAction.Execute() in d:\CSharp\NH\nhibernate\src\NHibernate\Action\EntityDeleteAction.cs:87
NHibernate.Engine.ActionQueue.Execute(IExecutable executable) in d:\CSharp\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:136
NHibernate.Engine.ActionQueue.ExecuteActions(IList list) in d:\CSharp\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:126
NHibernate.Engine.ActionQueue.ExecuteActions() in d:\CSharp\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:174
NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) in d:\CSharp\NH\nhibernate\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs:241
NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) in d:\CSharp\NH\nhibernate\src\NHibernate\Event\Default\DefaultFlushEventListener.cs:19
NHibernate.Impl.SessionImpl.Flush() in d:\CSharp\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:1479
以下是我的域名的外观:

public class Order : EntityBase {
    protected Order() {}
    public Order(Guid persistenceId) : base(persistenceId) {
        this.Lines = new List<OrderLine>();
    }
    public virtual int OrderId {get; private set;}
    IList<OrderLine> Lines {get; private set;}
}

public class OrderLine : EntityBase {
    protected OrderLine() {}
    public OrderLine(Guid persistenceId, Order order, int lineId) : base(persistenceId) {
        this.Order = order;
        this.LineId = lineId;
    }
    public virtual Order {get; private set;}
    public virtual LineId {get; private set;}
}

public abstart class EntityBase {
    protected EntityBase() {}
    protected EntityBase(Guid persistenceId) {
        this.PersistenceId = persistenceId;
    }
    public virtual Guid Persistenceid {get; private set;}
    public bool IsTransient {get {return Equals(this.PersistenceId, default(Guid)); }}
    public override bool Equals(object obj) {
        if(ReferenceEquals(null, obj))
            return false;
        if(ReferenceEquals(this, obj))
            return true;
        if(this.GetType() != obj.GetType())
            return false;
        return this.Equals((IEntity)obj);
    }
    public virtual bool Equals(IEntity other) {
        if(ReferenceEquals(null, other))
            return false;
        if(ReferenceEquals(this, other))
            return true;
        if(this.IsTransient || other.IsTransient)
            return false;
        return this.PersistenceId.Equals(other.PersistenceId);
    }
    public override int GetHashCode() {
        return this.IsTransient ? base.GetHashCode() : this.PersistenceId.GetHashCode();
    }
}
公共类顺序:EntityBase{
受保护顺序(){}
公共秩序(Guid persistenceId):基本(persistenceId){
this.Lines=新列表();
}
公共虚拟整数OrderId{get;private set;}
IList行{get;private set;}
}
公共类医嘱行:EntityBase{
受保护的医嘱行(){}
公共医嘱行(Guid persistenceId、Order Order、int lineId):基本(persistenceId){
这个。顺序=顺序;
this.LineId=LineId;
}
公共虚拟顺序{get;private set;}
公共虚拟线ID{get;private set;}
}
公共Abstrat类实体库{
受保护的EntityBase(){}
受保护的EntityBase(Guid persistenceId){
this.PersistenceId=PersistenceId;
}
公共虚拟Guid Persistenceid{get;private set;}
public bool IsTransient{get{return Equals(this.PersistenceId,default(Guid));}
公共覆盖布尔等于(对象对象对象){
if(ReferenceEquals(null,obj))
返回false;
if(ReferenceEquals(this,obj))
返回true;
if(this.GetType()!=obj.GetType())
返回false;
返回这个.Equals((IEntity)obj);
}
公共虚拟布尔等于(其他){
if(ReferenceEquals(null,其他))
返回false;
if(ReferenceEquals(this,other))
返回true;
if(this.IsTransient | | other.IsTransient)
返回false;
返回此.PersistenceId.Equals(其他.PersistenceId);
}
公共覆盖int GetHashCode(){
返回this.IsTransient?base.GetHashCode():this.PersistenceId.GetHashCode();
}
}
以下是我的映射文件的外观:

public class OrderClassMap : ClassMap<Order> {
    public OrderClassMap() {
        this.Table("Orders");
        this.Id(x => x.OrderId).Generated.Identity();
        this.Map(x => x.PersistenceId);
        this.HasMany(x => x.Lines).Inverse().KeyColumn("OrderId").Cascade.AllDeleteOrphan();
    }
}

public class OrderLineClassMap : ClassMap<OrderLine> {
    public OrderLineClassMap() {
        this.Table("OrderLines");
        this.CompositeId()
            .KeyReference(x => x.Order, "OrderId")
            .KeyProperty(x => x.LineId);
        this.Map(x => x.PersistenceId);
    }
}
公共类OrderClassMap:ClassMap{
public OrderClassMap(){
本表(“订单”);
this.Id(x=>x.OrderId).Generated.Identity();
this.Map(x=>x.PersistenceId);
this.HasMany(x=>x.Lines).Inverse().KeyColumn(“OrderId”).Cascade.AllDeleteOrphan();
}
}
公共类OrderLineClassMap:ClassMap{
public OrderLineClassMap(){
本表(“订单行”);
this.CompositeId()
.KeyReference(x=>x.Order,“OrderId”)
.KeyProperty(x=>x.LineId);
this.Map(x=>x.PersistenceId);
}
}

我找到了导致错误的原因。我的实体都有一个PersistenceId属性,该属性是唯一标识每个实体的GUID。在我的基类EntityBase中,我重写GetHashCode方法,并基于PersistenceId返回一个哈希代码。这对于NHibernate是错误的,因为我没有提供基于NHibernate预期Id(OrderId)的哈希代码。我为所有实体实现了一个新的GetHashCode和Equals方法,删除操作很好。

我知道这是一篇老文章,但是你能分享一下你在
EntityBase上的实现吗?