c# 允许在 list.add 中重复

c# allow duplicate in list.add

我在向列表中添加重复元素时遇到问题

我想添加那个对象:

public class Allegato : BaseObject<Allegato, int>
    {
        public override int Id { get; set; }
        public virtual string NomeFile { get; set; }
    }

在 BaseObject 中,我实现了只查看 Id 字段的 equals

我无法更改此设置,因为我的 NHibernate 数据访问基础结构需要这些设置

现在我有其他 class 和 Allegato 个对象的列表

public class Corso : BaseObject<Corso, int>
{
public virtual ICollection<Allegato> Allegati { get; set; } = new List<Allegato>();

        public virtual void AddAllegato(Allegato allegato)
        {
            this.Allegati.Add(allegato);
        }
}

现在我需要将许多 Allegato 添加到集合中,然后将其保存到数据库中,ID 将为空,因为将由数据库序列生成

using (myUow = myUowFactory.Create())
        {
            var obj = new Corso();
            //populate corso
            myUow.Corsi.Create(obj);
            
            var files = SessionManagement.LeggiOggetto<SessionObject.File>(HttpContext, SessionManagement.ChiaveSessione.File);
            foreach (var file in files)
                obj.AddAllegato(new Allegato { NomeFile = file.Nome });

            myUow.SaveAll();
        }

添加了第一个对象,但所有其他对象都没有。第一个元素保留所有其他元素不添加 调试它看到调用了 Allegato class 的 equals 方法,我该如何避免它?

谢谢

编辑

基础对象class

public abstract class BaseObject<TEntity, TKey> : EquatableObject<TEntity>
where TEntity : class
{
    public abstract TKey Id { get; set; }

    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }

    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;

        BaseObject<TEntity, TKey> other = obj as BaseObject<TEntity, TKey>;

        return BaseObjectEquals(other);

    }

    public override bool Equals(TEntity obj)
    {
        if (obj == null)
            return false;

        BaseObject<TEntity, TKey> other = obj as BaseObject<TEntity, TKey>;

        return BaseObjectEquals(other);

    }

    public virtual bool BaseObjectEquals(BaseObject<TEntity, TKey> other)
    {
        if (other == null)
            return false;

        return EqualityComparer<TKey>.Default.Equals(this.Id , other.Id);
    }

    private IEnumerable<FieldInfo> GetFields()
    {
        Type t = GetType();

        List<FieldInfo> fields = new List<FieldInfo>();
        while (t != typeof(object))
        {
            fields.AddRange(t.GetTypeInfo().DeclaredFields.Where(x => x.FieldType.Name != typeof(ICollection<>).Name));//.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public));

            t = t.GetTypeInfo().BaseType;
        }
        return fields;
    }

    public static bool operator ==(BaseObject<TEntity, TKey> x, BaseObject<TEntity, TKey> y)
    {
        // If both are null, or both are same instance, return true.
        if (System.Object.ReferenceEquals(x, y))
        {
            return true;
        }

        // If one is null, but not both, return false.
        if (((object)x == null) || ((object)y == null))
        {
            return false;
        }

        return x.Equals(y);
    }

    public static bool operator !=(BaseObject<TEntity, TKey> x, BaseObject<TEntity, TKey> y)
    {
        return !(x == y);
    }
}

如@Panagiotis Kanavos 所述,问题出在 NHibernate 中用 Set 集合覆盖了我的 属性。我将地图更改为 Bag 以使其工作