21 messaggi dal 10 agosto 2006
Buongiorno a tutti, mi son appena avvicinato alla tecnologia Silverlight e WCF RIA Services.
Sto realizzando un'applicazione di prova e non ho avuto assolutamente problemi nella gestione di Entity Framework 4, DomainServices, LINQ e quant'altro. Son riuscito a popolare senza problemi la datagrid ed a chiamare un'altra pagina di dettaglio che mostrasse, in un'apposita dataform, i dettagli del record selezionato.

Il problema è proprio relativo alla dataform: non riesco ad effettuare l'update di un record. Il codice che ho scritto è il seguente:

  
private void myDataForm_EditEnded(object sender, DataFormEditEndedEventArgs e)  
{  
   this._CandidatoDomainContext.SubmitChanges(DataSaved, null);  
}  


  
private void DataSaved(SubmitOperation sender)  
{  
   if (sender.HasError)  
   {  
      MessageBox.Show(string.Format("Submit Failed: {0}", sender.Error.Message));  
      sender.MarkErrorAsHandled();  
   }  
}  


L'errore che ricevo invece è il seguente :
Submit operation failed. Unable to update the EntitySet 'Candidato' because it has a DefiningQuery and no <UpdateFunction> element exists in the <ModificationFunctionMapping> element to support the current operation.

Cercando un po' sul web sembrerebbe che l'errore sia dovuto alla mancanza di una chiave primaria nel DataModel per le operazioni di Update/Delete. Come potete vedere, la chiave primaria invece c'è... http://img534.imageshack.us/img534/5004/candidato.jpg

Sapreste quindi come aiutarmi a riguardo??
Grazie anticipatamente.
2.190 messaggi dal 04 marzo 2004
Contributi | Blog
"motogpdesmo16" <motogpdesmo16> wrote in message news:362362@...
Buongiorno a tutti, mi son appena avvicinato alla tecnologia Silverlight e WCF RIA Services.
Sto realizzando un'applicazione di prova e non ho avuto assolutamente problemi nella gestione di Entity Framework 4, DomainServices, LINQ e quant'altro. Son riuscito a popolare senza problemi la datagrid ed a chiamare un'altra pagina di dettaglio che mostrasse, in un'apposita dataform, i dettagli del record selezionato.
Il problema è proprio relativo alla dataform: non riesco ad effettuare l'update di un record. Il codice che ho scritto è il seguente:
....
L'errore che ricevo invece è il seguente :
Submit operation failed. Unable to update the EntitySet 'Candidato' because
it has a DefiningQuery and no <UpdateFunction> element exists in the <ModificationFunctionMapping> element to support the current operation. Cercando un po' sul web sembrerebbe che l'errore sia dovuto alla mancanza di una chiave primaria nel DataModel per le operazioni di Update/Delete. Come potete vedere, la chiave primaria invece c'è...
http://img534.imageshack.us/img534/5004/candidato.jpg
Sapreste quindi come aiutarmi a riguardo??
Grazie anticipatamente.
Ciao,
nell'implementazione del tuo DomainService, hai il corrispondente metodo di Update?
Tipo:
public void UpdateCandidato(Candidato currentCandidato)
{
this.ObjectContext.Candidato.AttachAsModified(currentCandidato, this.ChangeSet.GetOriginal(currentCandidato));
}

Alessio Leoncini (WinRTItalia.com)
.NET Developer, Interactive Designer, UX Specialist, Trainer
21 messaggi dal 10 agosto 2006
Ciao,
grazie per la risposta innanzitutto.
Si l'implementazione del metodo c'è e presumo sia corretta in quanto è quella generata automaticamente all'atto della creazione del DomainService.
Girovagando sul forum ufficiale di silverlight, ho notato che sembra esserci una certa "incomprensione" tra l'EDM e il database quando una chiave primaria è di tipo uniqueidentifier, come nel mio caso per la colonna CurriculumGUID.

Ho provato infatti a generare EDM e relativo domain service di una tabella con chiave primaria di tipo int/identity e non ci sono stati problemi. Pertanto adesso, almeno per iniziare a prendere confidenza con il sistema, preferisco lavorare su una tabella "semplice" e poi mi concentrerò su casi particolari.

Dopo ulteriori ricerche son arrivato a capire gli eventi che scattano sulla dataform ed, in particolare, quello che dovrebbe fare al caso mio è EDIT ENDED. Di conseguenza il codice che ho scritto è:
        private void myDataForm_EditEnded(object sender, DataFormEditEndedEventArgs e)
        {
            if (e.EditAction == DataFormEditAction.Commit
            {
                if (myDataForm.ValidateItem())
                {
                    myDataForm.CommitEdit();
                    _PersonaDomainContext.SubmitChanges(DataSaved, null);
                }
            }
        }  

Tuttavia non riesco a salvare assolutamente nulla sul database anche con questa tabella. Le modifiche infatti riesco a vederle nell'oggetto locale (infatti quando chiudo la childwindow, i dati presenti nella datagrid son aggiornati in base alle modifiche appena apportate) ma nel database continuo a vedere sempre i vecchi dati. Stesso dicasi se chiudo e riapro il programma: ovviamente vedo i vecchi dati.
Sapresti aiutarmi nell'individuare l'errore?
grazie.
Modificato da motogpdesmo16 il 21 giugno 2010 11.18 -
21 messaggi dal 10 agosto 2006
Aggiorno con ulteriori novità: sono finalmente riuscito a salvare! Credo di aver commesso l'errore di lavorare su due domaindatasource differenti: uno della pagina di elenco dei record, ed uno della pagina di dettaglio.
Pertanto ho aggiunto un oggetto Domain Data Source (DDS) nella childwindow (frmCwDettaglio), l'ho opportunamente valorizzata e infine ho associato al CurrentItem della dataform, il SelectedItem della griglia. Il codice è il seguente:

     
                cwDettaglio frmCwDettaglio = new cwDettaglio();     
                frmCwDettaglio.Show();     
                frmCwDettaglio.Loaded += new RoutedEventHandler(delegate     
                    {     
                        frmCwDettaglio.DDS.DomainContext = this._PersonaDomainContext;     
                        frmCwDettaglio.myDataForm.CurrentItem = dtgPersona.SelectedItem;     
                    });     


Io l'ho collocato nell'evento SelectionChanged.

Nella child window invece ho dovuto solo lavorare sull'Edit Ended ma, anzichè chiamare il metodo SubmitChanges del datacontext, ho dovuto chiamare lo stesso metodo facente capo al Domain Data Source. Il codice è il seguente:

     
        private void myDataForm_EditEnded(object sender, DataFormEditEndedEventArgs e)     
        {     
            if (e.EditAction == DataFormEditAction.Commit)     
            {     
                if (myDataForm.ValidateItem())     
                {     
                    myDataForm.CommitEdit();     
                    DDS.SubmitChanges();     
                    this.DialogResult = true;     
                }     
            }     
            else     
                this.DialogResult = false;     
        }     

Ora sto impazzendo con l'operazione di Inserimento di un nuovo record..
Modificato da motogpdesmo16 il 21 giugno 2010 15.31 -
Modificato da motogpdesmo16 il 21 giugno 2010 15.52 -
21 messaggi dal 10 agosto 2006
Dopo ore di prove, ricerche e studio non sono riuscito a cavare pressochè un ragno dal buco..sicuramente mi manca qualcosa, qualche anello di congiunzione.

Lo scenario è sempre il medesimo: griglia che presenta tutti i record, pulsante (btnAdd) che mi consente di aprire una childWindow per effettuare l'inserimento di un nuovo record e appunto la childWindow (frmCwDettaglio) che contiene un dataform con campi autogenerati.

Il codice che ho inserito nell'evento Click del btnAdd

 
            cwDettaglio frmCwDettaglio = new cwDettaglio(); 
            frmCwDettaglio.Show(); 
            frmCwDettaglio.Loaded += new RoutedEventHandler(delegate 
            { 
                frmCwDettaglio.DDS.DomainContext = this._PersonaDomainContext; 
                Persona xxx = new Persona(); 
                xxx.Id_Persona = 22; 
                xxx.Nominativo = "PINCO PALLINO"; 
                frmCwDettaglio.myDataForm.CurrentItem = xxx; 
            }); 

Qui dentro ho provato veramente di tutto:
- ho tentato di di far riferimento al metodo AddNewItem della dataform nella speranza che questa riconoscesse il tentativo di un nuovo inserimento;
-ho solo istanziato il nuovo oggetto di tipo Persona omettendo la valorizzazione;
-ho istanziato ed ho valorizzato l'oggetto di tipo Persona (il codice che ho appena postato);
-ho provato ad omettere la valorizzazione del DomainDataSource (DDS).

Messaggi di errore non ne ottengo e la child window presumo risponda correttamente a quelle che sono le mie direttive: ad esempio nel caso del codice postato, la textbox inerente il nominativo nella childwindow viene correttamente valorizzata con PINCO PALLINO.
Il problema, forse, è quando premo il tasto salva della child window: l'evento Edit_Ended della dataform presente nella child window, scatta sempre, ma le operazioni descritte nel post precedente non sortiscono alcun effetto se si tratta di un nuovo inserimento (viceversa gli update funzionano tutti correttamente).

Ho provato anche a mettere una messagebox nell'evento AddingNewItem della dataform ma nulla, il programma non passa per nulla da quell'evento.

Riuscireste a darmi un aiuto??
Grazie.
272 messaggi dal 17 settembre 2006
       
cwDettaglio frmCwDettaglio = new cwDettaglio();        
frmCwDettaglio.Show();        
frmCwDettaglio.Loaded += new RoutedEventHandler(delegate        
{        
frmCwDettaglio.DDS.DomainContext = this._PersonaDomainContext;        
Persona xxx = new Persona();        
xxx.Id_Persona = 22;        
xxx.Nominativo = "PINCO PALLINO";        
frmCwDettaglio.myDataForm.CurrentItem = xxx;        
});        
       


Non vorrei sbagliare ma:

       
        
xxx.Id_Persona = 22;        
       
-- Questo dovrebbe essere generato automaticamente se sul DB è settato come identity. Quindi va omesso       
     


Il Validateitem
-- Per eventualmente validare i dati

Poi il Commit



Poi credo manchi L' ADD Sul DomainContext, in quanto nuovo se non lo inserisci lui non sà cosa spedire.

E poi il SubmitChanges



Spero di essere stato di aiuto e di aver centrato il problema
Modificato da Gionet il 24 giugno 2010 18.23 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.