Fluente NHibernate HasMany Raccolta Di Problemi
-
19-09-2019 - |
Domanda
Aggiornamento: Sembra che cambiando la mia mappatura dalla Cascata.Tutti() in Cascata.AllDeleteOrphan() consente di risolvere la maggior parte dei miei problemi.Devo ancora impostare esplicitamente la proprietà dell'Azienda sul OperatingState, che sembra inutile, in quanto è stato aggiunto alla entità della Società, ma almeno posso lavorare con che durante un aggiornamento.Ho ancora bisogno di test che crea.
Se uno puo spiegare che, che sarebbe un grande aiuto.
Aggiorna 2: Dopo aver giocato con un po ' di più, appare non sempre è necessario specificare l'entità padre.
Post Originale
Ho 2 entità correlate
public class Company {
//... fields
public virtual IList<OperatingState> OperatingStates { get; set; }
}
public class OperatingState {
public virtual Company Company { get; set; }// Mapped on CompanyID
public virtual string State { get; set; }
}
E sono mappati come questo:
public class CompanyMap : ClassMap<Company> {
public CompanyMap() {
//... fields
HasMany(x => x.OperatingStates)
.Cascade.All()
.Table("OperatingState");
}
}
public class OperatingStateMap : ClassMap<OperatingState> {
public OperatingStateStateMap() {
Id(x => x.ID);
References(x => x.Company);
Map(x => x.State);
}
}
Quindi, tutto bene fino a quando cerco di aggiornare la Società degli Stati di Funzionamento
Company company = _repo.GetSingle(123);
company.OperatingStates.Clear();
foreach(string state in form["OperatingStates"].Split(',')) {
company.OperatingStates.Add(new OperatingState(state));
}
_repo.Save(company); // calls ISession.SaveOrUpdate
Esso bombe con:
Impossibile inserire il valore NULL nella la colonna 'CompanyID' tabella 'ConsumerCartel.dbo.CompanyOperatingState';la colonna non consente valori null.INSERIRE non riesce.La dichiarazione è stata è terminato.
Tuttavia, se faccio 2 cambi per ora funziona
Company company = _repo.GetSingle(123);
// don't clear the list this time;
foreach(string state in form["OperatingStates"].Split(',')) {
OperatingState os = new OperatingState(state);
// explicitly setting the company
os.Company = company;
company.OperatingStates.Add(os);
}
_repo.Save(company); // calls ISession.SaveOrUpdate
A cui si aggiungeranno i nuovi stati membri, in aggiunta a quelli vecchi, che non è quello che voglio.Tuttavia, anche quando esplicitamente l'azienda (che non avrei dovuto fare quando è aggiunto al tracciato un elenco?) non funziona se l'elenco viene cancellato.
Questo codice ha lavorato su altri enti, ma non su questo, quindi credo che questo dovrebbe funziona come scritto.Che cosa sto facendo di sbagliato?
Soluzione
Avete provato a usare Inversa()?
HasMany(x => x.OperatingStates)
.Inverse()
.Cascade.All()
.Table("OperatingState");