2017-02-02 17 views
0

我將Nhibernate收藏集映射爲asSet時出現問題,在添加新項目時收集所有其他項目都丟失了。Nhibernate在添加第一個新項目時從AsSet收藏中丟失了以前的項目

但更奇怪的是,那些appens只有一次,因爲我重新啓動應用程序的每個以下插入給沒有問題

這是我的目標:

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

} 

BaseObject重載equals使用ID屬性

EquatableObject覆蓋等於比較所有對象屬性

地圖:

public AttivitaMap() 
    { 
     Table("Attivita_T041"); 
     Id(x => x.Id) 
      .Column("Kint_T041_IdAttivita").GeneratedBy.Assigned(); 
     HasMany<SAL>(x => x.StatiAvanzamentoLavori) 
     .Access.CamelCaseField(Prefix.Underscore) 
     .KeyColumns.Add("int_T018_IdAttivita", x => x.UniqueKey("IX18_1")) 
     .ForeignKeyConstraintName("FK18_IdAtt") .Not.LazyLoad().Cascade.All(); 
    } 
} 

public SALMap() 
{ 
    Table("SAL_T018"); 

    Id(x => x.id) 
     .Column("Kint_T018_IdSAL")    
     .GeneratedBy.Identity(); 

    Map(x => x.DataRiferimento).UniqueKey("IX18_1") 
      .Not.Nullable(); 
    Map(x => x.DataAvvioPrevisto); 
    Map(x => x.DataConclusionePrevista).Not.Nullable(); 
} 

最後測試:

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

    } 
} 

因此,當我添加第二個SAL首先是失去了,但是當我添加第三個第二個仍然存在,爲什麼?

看着SQL日誌我看到,當我添加第二個SAL未更新被炒到SAL表設置IdAttivita爲NULL,所以鏈接Attivita丟失

我讀here是刪除和插入各個環節的行爲是用袋款式設計,但我有一個主鍵

更奇怪的,如果我改變AsSetAsBag(或者乾脆刪除AsAet)設置集合映射一切工作正常,但我需要設置其他的東西(如多發性提取)

+0

'SAL1'和'SAL2'看起來以同樣的方式創建。如果他們的平等測試認爲他們是平等的,那麼一套應該忽略第二個合同。 –

回答

0

作爲自己的錯誤追蹤系統問題回答了NHibernate的開發者是混合Equals方法:值對象必須比較了它們的性能和實體通過其ID

我的錯用與SAL

所以我等維護它的實體peropery比較使用BaseObject並且所有工作正常

相關問題