2012-10-25 6 views
11

Mi piacerebbe fare un controllo-poi-aggiornamento in un'operazione atomica. Sto usando dbcontext per gestire la transazione. Mi aspettavo di ottenere un'eccezione se il record è stato modificato da un altro thread ma non viene lanciata alcuna eccezione. Qualsiasi aiuto sarebbe apprezzato. Ecco la mia uscita:Come abilitare il controllo della concorrenza usando prima il codice EF 5.0?

Thread-4: Reading... 
Thread-5: Reading... 
Thread-5: Updating destination 1 
Thread-4: Updating destination 1 
Thread-4: SaveChanges 
Thread-5: SaveChanges 

Ecco il mio frammento di codice:

public static void Main(string[] args) 
{ 
    PopulateData(); 
    (new Thread(UpdateDestination1)).Start(); 
    (new Thread(UpdateDestination1)).Start(); 
} 

public static void UpdateDestination1() 
{ 
    using (var context1 = new BreakAwayContext()) 
    { 
     Console.WriteLine("Thread-{0}: Reading...", Thread.CurrentThread.ManagedThreadId); 
     var d = context1.Destinations.FirstOrDefault(); 
     Console.WriteLine("Thread-{0}: Updating destination {1}", Thread.CurrentThread.ManagedThreadId, d.DestinationId); 
     d.Name = "Thread-" + Thread.CurrentThread.ManagedThreadId; 
     try 
     { 
      context1.SaveChanges(); 
      Console.WriteLine("Thread-{0}: SaveChanges", Thread.CurrentThread.ManagedThreadId); 
     } 
     catch (OptimisticConcurrencyException) 
     { 
      Console.WriteLine("OptimisticConcurrencyException!!!"); 
      throw; 
     } 
    } 
} 

risposta

19

È possibile utilizzare ConcurrencyCheck annotazioni su una proprietà (http://msdn.microsoft.com/en-us/data/gg193958.aspx) o IsConcurrencyToken() o .IsRowversion quando si configura una proprietà con API fluente (http://msdn.microsoft.com/en-us/data/jj591617#1.12). In genere avresti una colonna rowversion nel database.

+0

Ha funzionato. Grazie! – user1342718

+0

Quindi contrassegnalo come risposta. – Pawel

+0

Ho provato a. Diceva "Vota Up richiede 15 reputazione". Scusate. – user1342718