2017-02-02 1 views
0

J'ai un problème avec la collection Nhibernate mappée asSet, en quelques mots lorsque j'ajoute un nouvel élément à la collection, tous les autres éléments sont perdus.Nhibernate perd l'élément précédent de la collection AsSet lors de l'ajout du premier nouveau

mais ce qui est plus étrange est que ces appens une seule fois, chaque insertion suivante donnent pas de problème puisque je redémarrer l'application

ce mon objet:

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 surchargent equals en utilisant la propriété ID

EquatableObject override Égal à comparer toutes les propriétés d'objet

les cartes:

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

et enfin le test:

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

    } 
} 

donc quand j'ajouter le second sal le premier est perdu mais quand j'ajoute le troisième le deuxième reste, pourquoi ??

regardant SQL journal je vois que quand j'ajouter le deuxième SAL un mise à jour est tiré à SAL paramètres TABLE IdAttivita NULL, donc lien vers Attivita est perdu

i lire here que la suppression et l'insertion de tous les liens est un comportement est par la conception avec la collection sac, mais j'ai SET avec si je change AsSet à AsBag (ou simplement supprimer AsAet) clé primaire

Plus étrange pour la cartographie de collection tout fonctionne très bien, mais je besoin de définir d'autres choses (comme plusieurs fetch)

+0

'SAL1' et' SAL2' semble être créé de la même manière. Si leur test d'égalité les considère comme égaux, un ensemble doit ignorer le second ajout par contrat. –

Répondre

0

Comme répondu par le développeur Nhibernate sur leur problème bugtracker mixait equals: objet de valeur doit être comparée par leurs propriétés et entité par leur id

Ma faute a été en utilisant la comparaison de peropery avec l'entité SAL

Alors je DEMARREZ il pour utiliser BaseObject et tout fonctionne bien