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?

È stato utile?

Soluzione

Avete provato a usare Inversa()?

HasMany(x => x.OperatingStates)
    .Inverse()
    .Cascade.All()
    .Table("OperatingState");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top