我將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是刪除和插入各個環節的行爲是用袋款式設計,但我有一個主鍵
更奇怪的,如果我改變AsSet
到AsBag
(或者乾脆刪除AsAet
)設置集合映射一切工作正常,但我需要設置其他的東西(如多發性提取)
'SAL1'和'SAL2'看起來以同樣的方式創建。如果他們的平等測試認爲他們是平等的,那麼一套應該忽略第二個合同。 –