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)
'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. –