Domanda

Sto lavorando con Entity Framework 4 (usando entità di auto-tracciamento) e accedendo a una vista, che è l'unione di due tabelle.Quindi quando aggiorno le informazioni della vista, invio lo STE della vista al repository che accede al database.

Ho fatto quanto segue:

Quando ricevo la mia vista con le informazioni aggiornate, creo il mio STE1 e STE2.Come quando creo un STE, questo viene creato con uno stato aggiunto.Quindi come so per lo stato della STE della vista che lo stato è modificato, cambio lo stato dei miei due STE con il metodo MarkedAsModified.

Quindi, come ho nel STE della vista le informazioni delle due tabelle, passo le informazioni dalla vista al STE corretto, e applico le modifiche dal STE al objectContext.

Finalmente faccio il saveChanges.Ma in questo passo ricevo un Optimistic concurrency exception.Penso che sia perché il passaggio STE dallo stato a Added per Modified quindi il contesto rileva che c'è qualche modifica tra la creazione e il SaveChanges, ma anche cerco di AcceptChanges nel STE, successivamente contrassegnato come modificato e, applicare le modifiche e, infine, SaveChanges, ma il problema persiste.

Come posso risolvere il problema?c'è un modo migliore per lavorare con view e Entity Framework v4?

Grazie.Daimroc.

MODIFICA 1:Ho ancora problemi.Il mio codice è il seguente:

Componenti myComponent = nuovi componenti();/questo è un STE myComponent.Rereference = myView . Riferimento;...// altre proprietà myComponent.MarkedAsModified();// questo è necessario perché voglio aggiornare le informazioni, non aggiungere un nuovo registro.myContext.ApplyChanges ("Componenti", myComponent);miContexto.SaveChanges();

Nei SaveChanges, ottengo l'eccezione:l'istruzione update, insert o delete ha interessato un numero imprevisto di righe (0).Le entità potrebbero essere state modificate o eliminate da quando le entità sono state caricate.Aggiorna le voci ObjectStateManager.

Qual è il problema?non posso modificare un nuovo STE creato?

Grazie.

È stato utile?

Soluzione

Ho trovato il modo di risolvere il problema.

In una prima soluzione, la soluzione consisteva nel fare una query al database per ottenere i registri esistenti nel database.Questo aggiunge le entità nel contesto e quindi è possibile modificare i dati e salvare correttamente le modifiche.

Ma più tardi, ho trovato il modo di evitare il necessario per rendere la query la base di dati per aggiungere le entità modificate nel contesto.

Il modo sta usando il seguente codice:

Customers myCustomer = new Customers  { IDCustomer = myCustomer.IDCustomer };
myContext.Customers.Attach(myCustomer);

//update the data of the entity.

myContext.SaveChanges();

La soluzione consiste nel creare una nuova entità impostando la chiave primaria.Se l'entità avesse FK sarebbe indicata nello stesso modo.A questo punto, l'entità ha lo stato aggiunto.

Successivamente, è collegato al contesto e quindi può essere modificato.Quando un campo viene modificato, l'entità cambia il suo stato in modificato, quindi quando viene chiamato SaveChanges (), EF aggiorna l'entità, non tenta di aggiungerne una nuova.

Trovo queste informazioni in questo link.In questo post la soluzione è per eliminare un'entità senza recuperarla nel database, bur l'idea funziona anche se vogliamo modificare un registro esistente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top