Как предполагает Бруно, проблема заключается в том, что GetHashCode возвращает разные значения (либо ссылку на объект базовых объектов, либо значение первичного ключа). в большинстве ситуаций это не проблема для меня, так как я редко меняю объект после его сохранения, но при некоторых обстоятельствах, как показано ниже, это может вызвать проблемы:

я есть 2 класса, которые обрабатываются NHibernate: AssetGroup, Asset AssetGroup имеет коллекцию ISet _assets. Конструктор AssetGroup скажет

_assets = new HashSet<Asset>();

У меня есть некоторые операции, чтобы добавить, удалить актив в AssetGroup

    public abstract class Entity<Tid>
{
    public virtual Tid Id { get; protected set; }

    public override bool Equals(object obj)
    {
        return Equals(obj as Entity<Tid>);
    }

    public static bool IsTransient(Entity<Tid> obj)
    {
        return obj != null && Equals(obj.Id, default(Tid));
    }

    private Type GetUnproxiedType()
    {
        return GetType();
    }

    public virtual bool Equals(Entity<Tid> other)
    {
        if (other == null)
            return false;
        if (ReferenceEquals(this, other))
            return true;
        if (!IsTransient(this) && !IsTransient(other) && Equals(Id, other.Id))
        {
            var otherType = other.GetUnproxiedType();
            var thisType = GetUnproxiedType();
            return thisType.IsAssignableFrom(otherType) || otherType.IsAssignableFrom(thisType);
        }
        return false;
    }

    public override int GetHashCode()
    {
        if (Equals(Id, default(Tid)))
        {
            return base.GetHashCode();
        }
        else
        {
            return Id.GetHashCode();
        }
    }
}

///////////////////////////////////////


public class AssetGroup : Entity<int>
{
    public AssetGroup()
    {
        this._assets = new HashedSet<Asset>();
    }
    virtual public Guid SecurityKey {get; set;}

    virtual public string Name { get; set; }

    private ISet<Asset> _assets;
    virtual public ISet<Asset> Assets
    {
        get { return _assets; }
        protected set { _assets = value; }
    }

    virtual public bool AddAsset(Asset asset)
    {
        if (asset != null && _assets.Add(asset))
        {
            return true;
        }
        return false;
    }

    virtual public bool RemoveAsset(Asset asset)
    {
        Asset target = null;
        foreach (var a in _assets)
        {
            var x = a.GetHashCode();
            var b = a.Equals(asset);
            if (a.Equals(asset))
                target = a;
        }
        if (target == null)
            return false;
        if (asset != null && _assets.Remove(target))
        {
            return true;
        }
        return false;
    }

}

////////////////////////////////////////

public class Asset : Entity<int> 
{
    public Asset()
    {
        SecurityKey = Guid.NewGuid();
    }

    public virtual Guid SecurityKey { get; set; }

    virtual public int AssetGroupID { get { return (AssetGroup != null ? AssetGroup.Id : 0); } }

    virtual public string Name { get; set; }

    virtual public AssetGroup AssetGroup { get; set;}

    virtual public void SetAssetGroup(AssetGroup assetGroup)
    {
        AssetGroup prevRef = AssetGroup;
        if (prevRef == assetGroup)
            return;
        AssetGroup = assetGroup;
        if (prevRef != null)
            prevRef.Assets.Remove(this);
        if (assetGroup != null)
            assetGroup.Assets.Add(this);
    }
}

RemoveAsset не удается удалить актив. У меня есть foreach, чтобы проверить, существует ли актив в _assets. Я установил контрольные точки для его отслеживания, и цикл foreach может найти ресурс (target) для удаления из объекта. Как ни странно, когда я спрашиваю _assets Удалить цель. Не удается удалить и вернуть false. Также, если я спрашиваю _assets.Contains (target) .. он также возвращает false .. даже если цикл foreach в RemoveAsset может найти цель ...

два отображения nhibernate

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               assembly="MySystem.Domain"
               namespace="MySystem.Domain" auto-import="true">

Кто-нибудь может мне помочь ?

Ответы на вопрос(3)

Ваш ответ на вопрос