Question

Say ont le code suivant:

public void SaveOrUpdate(OrderContract orderContract)
{
   foreach (var orderContract in orderContract.Tests)
   {

      Order order=dataAccess.FindOne<Order>(x=>x.OrderId==orderContract.OrderId) 
                  ?? new Order();

      // Where there are updates, put the stuff in the 
      // contract over what we already had.
      Mapper.Map(orderContract, order);

       // if it is new then add it in so it is inserted by EF.
      if (orderedTest.OrderedTestId <= 0)
          dataAccess.Add(orderedTest);

   }
   dataAccess.SaveChanges();
}

Est-ce que EF a quelque chose qui prendra soin si quelqu'un met à jour une commande après le récupérer (dans l'appel FindOne?

Ou bien remplacer simplement heureux des changements qui ont été effectués entre la récupération des données et mon appel à SaveChanges?

Si elle ne le fait pas, alors serait un appel ObjectContext.Connection.BeginTransaction mieux pour me protéger? Ou devrais-je utiliser new TransactionScope()?

Et comment l'un de ces savoir ce que les lignes que je dois avoir dans une transaction. (Tout simplement parce que je l'ai lu une ligne ne veut pas dire que je veux verrouillé. Ou est-il verrouiller toutes les tables dans le modèle (beurk)).

Note: Je suis en cours d'exécution avec SQL Server 2008 R2 et EF 4.1

Était-ce utile?

La solution

Par défaut, oui il écrasera enregistrements modifiés. Si vous êtes inquiet pour votre application, lisez ceci:

http://msdn.microsoft.com/en-us/library/ bb738618.aspx

Par défaut, Entity Framework met en œuvre un modèle d'accès concurrentiel optimiste. Cela signifie que les verrous ne sont pas détenus sur les données de la source de données entre le moment où les données sont demandées et les données sont mises à jour. Entity Framework enregistre les modifications des objets à la base de données sans vérifier la concurrence. Pour les entités qui pourraient éprouver un degré élevé de concurrence, nous recommandons que l'entité définir une propriété dans la couche conceptuelle avec un attribut de ConcurrencyMode = « fixe » ..... (lien de suivi pour en savoir plus)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top