C# 在添加第一个新项目时,Nhibernate会从资产集合中丢失上一个项目

C# 在添加第一个新项目时,Nhibernate会从资产集合中丢失上一个项目,c#,nhibernate,set,C#,Nhibernate,Set,我对Nhibernate集合映射资产有一个问题,简单地说,当我向集合添加新项目时,所有其他项目都会丢失 但更奇怪的是,这些只出现了一次,自从我重新启动应用程序后,每次插入都没有问题 这是我的目标: public class Attivita : BaseObject<Attivita, int> { public override int Id { get; set; } private ICollection<SAL> _statiAvanza

我对Nhibernate集合映射资产有一个问题,简单地说,当我向集合添加新项目时,所有其他项目都会丢失

但更奇怪的是,这些只出现了一次,自从我重新启动应用程序后,每次插入都没有问题

这是我的目标:

    public class Attivita : BaseObject<Attivita, int> { 
    public override int Id { get; set; }
    private ICollection<SAL> _statiAvanzamentoLavori = new List<SAL>();
    public virtual IEnumerable<SAL> StatiAvanzamentoLavori { 
        get { return _statiAvanzamentoLavori.ToArray(); } 
    }

    public virtual void AddSAL(DateTime dataRiferimento, DateTime dataAvvioPrevisto, DateTime dataConclusionePrevista) {
        if (!(_statiAvanzamentoLavori.Any(x => x.DataRiferimento == dataRiferimento))){ 
            SAL sal = new SAL{ 
                DataRiferimento = dataRiferimento,
                DataAvvioPrevisto = dataAvvioPrevisto,
                DataConclusionePrevista = dataConclusionePrevista,            
            };
            _statiAvanzamentoLavori.Add(sal);
            }
        }
    }

public class SAL : EquatableObject<SAL>
{
    protected internal virtual int id {get; set;}
    public virtual DateTime DataRiferimento {get; set;}
    public virtual DateTime DataAvvioPrevisto {get; set;}
    public virtual DateTime DataConclusionePrevista {get; set;}

}
最后是测试:

[Test]      
public void AttivitaRepositoryCanInsertSALOnNotEmptyCollection()   {            
    var attivita = fixture.Create<Attivita>();
    var SAL1 = fixture.Create<SAL>();
    var SAL2 = fixture.Create<SAL>();

    attivita.AddSAL(SAL1.DataRiferimento, SAL1.DataAvvioPrevisto, SAL1.DataConclusionePrevista);
    using (UnitOfWork uow = GetUnitOfWork()) {
        uow.Attivita.Update(attivita);
        uow._session.Transaction.Commit();
    }

    using (UnitOfWork uow = GetUnitOfWork()) {
        attivita = uow._session.Get<Attivita>(attivita.Id);
        // this test pass
        attivita.StatiAvanzamentoLavori.Count().Should().Be(1); 
        attivita.AddSAL(SAL2.DataRiferimento, SAL2.DataAvvioPrevisto, SAL2.DataConclusionePrevista, SAL2.StatoAvanzamentoAttivita);
        uow.Attivita.Update(attivita);
        uow._session.Transaction.Commit();
    }

    using (UnitOfWork uow = GetUnitOfWork()) {              
        // this test fails: expected 2 found 1      
        uow._session.Get<Attivita>(attivita.Id).StatiAvanzamentoLavori.Count().Should().Be(2); 

var SAL3 = fixture.Build<SAL>().With(x => x.StatoAvanzamentoAttivita, statoAvanzamentoTest).Create();
using (UnitOfWork uow = GetUnitOfWork()) {
    attivita = uow._session.Get<Attivita>(attivita.Id); 
    attivita.AddSAL(SAL3.DataRiferimento, SAL3.DataAvvioPrevisto, SAL3.DataConclusionePrevista, SAL3.StatoAvanzamentoAttivita);
    uow.Attivita.Update(attivita);
    uow._session.Transaction.Commit();
}
using (UnitOfWork uow = GetUnitOfWork()) {
    uow._session.Get<Attivita>(attivita.Id).StatiAvanzamentoLavori.Count().Should().Be(3);  

 // this test fails: expected 3 found 2         
}

    }
}
[测试]
public void AttivitaRepositoryCanInsertSALOnNotEmptyCollection(){
var attivita=fixture。创建移除和插入所有链接的行为是通过袋子收集设计的,但我已经设置了主键


更奇怪的是,如果我将
AsSet
更改为
AsBag
(或者简单地删除
aset
)以进行集合映射,所有工作都正常,但我需要设置其他工作(如多次提取)

正如Nhibernate开发人员在他们的bugtracker上回答的那样,问题是混合等于方法:值对象必须通过其属性进行比较,实体必须通过其id进行比较

我的错是用peropery和实体SAL比较


因此,我选择使用BaseObject,所有工作正常

SAL1
SAL2
看起来都是以相同的方式创建的。如果它们的相等性测试认为它们相等,则集合应忽略第二个按合约添加。
[Test]      
public void AttivitaRepositoryCanInsertSALOnNotEmptyCollection()   {            
    var attivita = fixture.Create<Attivita>();
    var SAL1 = fixture.Create<SAL>();
    var SAL2 = fixture.Create<SAL>();

    attivita.AddSAL(SAL1.DataRiferimento, SAL1.DataAvvioPrevisto, SAL1.DataConclusionePrevista);
    using (UnitOfWork uow = GetUnitOfWork()) {
        uow.Attivita.Update(attivita);
        uow._session.Transaction.Commit();
    }

    using (UnitOfWork uow = GetUnitOfWork()) {
        attivita = uow._session.Get<Attivita>(attivita.Id);
        // this test pass
        attivita.StatiAvanzamentoLavori.Count().Should().Be(1); 
        attivita.AddSAL(SAL2.DataRiferimento, SAL2.DataAvvioPrevisto, SAL2.DataConclusionePrevista, SAL2.StatoAvanzamentoAttivita);
        uow.Attivita.Update(attivita);
        uow._session.Transaction.Commit();
    }

    using (UnitOfWork uow = GetUnitOfWork()) {              
        // this test fails: expected 2 found 1      
        uow._session.Get<Attivita>(attivita.Id).StatiAvanzamentoLavori.Count().Should().Be(2); 

var SAL3 = fixture.Build<SAL>().With(x => x.StatoAvanzamentoAttivita, statoAvanzamentoTest).Create();
using (UnitOfWork uow = GetUnitOfWork()) {
    attivita = uow._session.Get<Attivita>(attivita.Id); 
    attivita.AddSAL(SAL3.DataRiferimento, SAL3.DataAvvioPrevisto, SAL3.DataConclusionePrevista, SAL3.StatoAvanzamentoAttivita);
    uow.Attivita.Update(attivita);
    uow._session.Transaction.Commit();
}
using (UnitOfWork uow = GetUnitOfWork()) {
    uow._session.Get<Attivita>(attivita.Id).StatiAvanzamentoLavori.Count().Should().Be(3);  

 // this test fails: expected 3 found 2         
}

    }
}