2012-10-15 14 views
5

Sto cercando di aggiornare una parte specifica di codice seguente:Qual è il modo corretto di aggiornare ContentItem in Orchard?

var nationalPart = _contentManager.Get<NationalPart>(Id);  
nationalPart.Name = part.Name; 

ho già fatto this.but ora non è working.even io chiamo contentManager.Flush() esplicitamente, ma ancora senza fortuna. Qualcuno mi può aiutare con questo? grazie in anticipo.

EDIT: ho trovato da dove proviene il mio problema! quando faccio una richiesta JSON per aggiornare un contentPart.la versione in memoria è in fase di aggiornamento ma non sta riflettendo il risultato su db.now siamo un passo avanti per rispondere.ma cosa impedisce alla sessione di aggiornare il db?

EDIT2:

questo è il codice per il mio gestore:

 public NationalPartHandler(IRepository<NationalPartRecord> repository) 
     { 
      Filters.Add(StorageFilter.For(repository)); 
     } 

questo è il codice per l'azione di controllo:

[GridAction(EnableCustomBinding = true)] 
    public JsonResult UpdateNational(NationalViewModel Model, GridCommand Command) 
    { 
     if (!ModelState.IsValid) 
      return new JsonResult { Data = "error" }; 
     var NationalPart = _contentmanager.Get(Model.Id).As<NationalPart>(); 
     NationalPart.Record = new NationalPartRecord(); 
     NationalPart.Record.MapFrom<NationalPartRecord, NationalViewModel>(Model); 
     _soccerService.UpdateNational(NationalPart);   
     return NationalsListJson(Command); 
    } 

e, infine, il codice per il servizio:

public void UpdateNational(NationalPart part) 
{ 
    var nationalPart = _contentManager.Get<NationalPart>(part.Id);  
    nationalPart.Name = part.Name; 
    _contentManager.Flush(); 
} 
+0

Ti sei ricordato che il setter della proprietà della parte imposta il valore della proprietà nella classe record? L'ho dimenticato prima. –

+0

Se non funziona, probabilmente si ha un'eccezione da qualche parte durante il rollback della transazione. Controlla app_data \ logs. –

+0

@BertrandLeRoy Ho ricontrollato la directory logs.but è vuoto (non c'è errore). –

risposta

6

rimuovere la riga

NationalPart.Record = new NationalPartRecord(); 

Il record sottostante viene generato automaticamente e viene inoltrata in modo NHibernate può salvare i dati nel database ogni volta che si esegue una modifica ad esso. Non vuoi sostituirlo mai, altrimenti nessun dato verrà salvato.

UpdateNational è ridondante e si può rimuovere - si dispone già di part.Name (che se ho capito bene, dovrebbe mappare part.Record.Name) impostato durante la chiamata a record.MapFrom.

Così la versione corretta sarebbe simile a questa

[GridAction(EnableCustomBinding = true)] 
public JsonResult UpdateNational(NationalViewModel Model, GridCommand Command) 
{ 
    if (!ModelState.IsValid) 
     return new JsonResult { Data = "error" }; 
    var part = _contentmanager.Get(Model.Id).As<NationalPart>(); 
    part.Record.MapFrom<NationalPartRecord, NationalViewModel>(Model);   
    return NationalsListJson(Command); 
} 

dato il vostro NationalPart è simile a:

public NationalPart : ContentPart<NationalPartRecord> 
{ 
    public string Name { 
     get { return Record.Name; } 
     set { Record.Name = value; } 
    } 
} 

Riassumendo - se si desidera memorizzare alcuni dati a Orchard, tutto quello che dovete fare è a impostare un valore di alcune proprietà di un record, niente di più. I dati verranno mantenuti al termine di una richiesta (o prima, se si chiama IContentManager.Flush()).

+0

molte grazie a voi.infatti quella riga era un codice stupido che ho dimenticato di rimuovere. –

+0

@BehnamEsmaili Nessun problema, succede;) Sono contento che sia stato d'aiuto. –

+0

@Piotr Szmyd Oggi il metodo Flush() non è presente nell'interfaccia IContentManager. Puoi darci un'opzione aggiornata per favore? –

Problemi correlati