2013-02-13 17 views
6
var paymentAttempt = _auctionContext.PaymentAttempts.Where(o => o.Id == paymentAttemptId).SingleOrDefault(); 
if (paymentAttempt != null) 
{ 
    paymentAttempt.PaymentAttemptStatusId = (int)PaymentAttemptStatus.Defunct; 
    paymentAttempt.PaymentAttemptStatus = _auctionContext.PaymentAttemptStatuses.Where(pas => pas.Id == paymentAttempt.PaymentAttemptStatusId).First(); 

    var relevantWinningBidsTotalPrices = _auctionContext.GetWinningBidsTotalPricesForPaymentAttempt(paymentAttemptId).ToArray(); 

    foreach (var winningBid in relevantWinningBidsTotalPrices) 
    { 
     winningBid.Locked = false; 
     _auctionContext.UpdateObject(winningBid); 
    } 
    _auctionContext.SaveChanges(); 
} 

Nel codice di cui sopra, dopoEntity Framework SaveChanges() non l'aggiornamento del database

_auctionContext.SaveChanges(); 

si chiama winningBid viene aggiornato come previsto, ma non è paymentAttempt. Perchè è questo? È davvero frustrante. Non ci sono errori neanche. Mi aspetterei che si verificasse un errore se ci fosse un problema come EF non stava rintracciando l'oggetto o qualcosa del genere, ma non si sta verificando tale errore.

+0

Usa Collegare per ottenere la vostra entità modificata nel contesto. Prima di salvare. Il contesto non aveva idea di cosa tu stia parlando. – Tabish

risposta

10

Ecco perché è necessario passare l'oggetto paymentAttempt al proprio contesto, per far sapere che si tratta di un oggetto che deve essere aggiornato.

Ad esempio, supponendo che _auctionContext è un'istanza di DbContext:

// any changes related to the paymentAttempt object 

_auctionContext.Entry(paymentAttempt).State = EntityState.Modified; 

foreach (var winningBid in relevantWinningBidsTotalPrices) 
{ 
    winningBid.Locked = false; 
    _auctionContext.UpdateObject(winningBid); 
} 

_auctionContext.SaveChanges(); 

Un'altra opzione è il metodo Attach:

_auctionContext.Attach(paymentAttempt); 
_auctionContext.ObjectStateManager.ChangeObjectState(paymentAttempt, System.Data.EntityState.Modified); 
+0

Non ho un metodo di inserimento. –

+0

Quale versione del framework di entità stai usando? – Jorge

+0

4. Stiamo utilizzando i servizi dati WCF sopra EF. –

1

caddi su questa domanda, ma per un problema differente. Ho scoperto che se chiami SaveChanges() su un oggetto che non è stato modificato, EF non aggiornerà nulla. Questo ha senso, ma avevo bisogno che il DB venisse aggiornato in modo che gli altri utenti vedessero che era stato eseguito un SaveChanges(), indipendentemente dal fatto che qualche campo fosse cambiato. Per forzare un aggiornamento senza cambiare tutti i campi:

Dim entry As DbEntityEntry = entities.Entry(myentity) 
    entry.State = Entity.EntityState.Modified 
2

Se non si dispone di Entry prova ad aggiungere:

using System.Data.Entity.Infrastructure; 

using System.Data.Entity; 

allora si può utilizzare semplicemente:

_auctionContext.Entry(paymentAttempt).State = EntityState.Modified; 
_auctionContext.SaveChanges(); 
Problemi correlati