EF: Comment dois-je appeler SaveChanges deux fois à l'intérieur d'une transaction?

À l'aide de Entity Framework (le premier code dans mon cas), j'ai une opération qui m'oblige à appeler SaveChanges pour mettre à jour un objet dans la base de données, puis SaveChanges nouveau pour mettre à jour un autre objet. (J'ai besoin de la première SaveChanges pour résoudre un problème où les EF ne pouvez pas comprendre quel est l'objet à mettre à jour en premier).

J'ai essayé de faire:

using (var transaction = new TransactionScope())
{
    // Do something

    db.SaveChanges();

    // Do something else

    db.SaveChanges();

    tramsaction.Complete();
}

Quand je le lance, j'obtiens une exception à la deuxième SaveChanges appel, en disant: "le fournisseur sous-jacent a échoué à l'ouverture". L'exception interne dit que MSDTC n'est pas activé sur ma machine.

Maintenant, j'ai vu des posts d'ailleurs qui décrivent comment activer ms DTC, mais il me semble que j'aurais également besoin de permettre l'accès au réseau, etc. Cela sonne comme complète exagéré ici, car il n'y a pas d'autres bases de données concernées, sans parler d'autres serveurs. Je ne veux pas faire quelque chose qui va rendre ma requête dans son ensemble est moins sûr (ou plus lent).

Il doit sûrement y avoir un plus léger façon de le faire (idéalement sans MSDTC)?!

Êtes-vous à l'aide de SQL 2008? Selon votre logique réelle est, vous pouvez ouvrir plusieurs connexions sans escalade. Voici un grand poste briser lorsque le DTC est appelée: l'étendue de Transaction Automatiquement l'escalade à MSDTC
Si vous voulez tout faire en une seule transaction, quelle est la différence entre l'épargne tout en une fois, ou de tout enregistrer plusieurs Fois? Dans les deux cas, tout sera sauvé ou rien ne sera enregistré, donc je ne vois pas l'avantage de multiples arrêts. Comme par le commentaire ci-dessous - dans Sql Server 2005 l'ouverture d'une connexion multiple au sein d'une transaction (même si la source est la même) provoque la promotion de la transaction une transaction distribuée. Ce qui a été amélioré dans Sql Server 2008, où vous pouvez ouvrir plusieurs connexions à la même source de données à l'intérieur d'un trx sans causer de promotion
Je suis à l'aide de SQL server 2012. Je n'ai pas (ou ne veulent) les connexions multiples, et ne veulent pas vraiment à l'utilisation de MSDTC!
Je ne comprends pas. J'ai pensé que chaque SaveChanges serait d'utiliser sa propre transaction, et donc, la première peut réussir, et le second pourrait échouer et revenir, laissant ma base de données incohérentes. C'est pourquoi j'ai pensé que j'avais besoin d'une transaction externe. Avais-je tort?
Si il y a une ambiance de transaction de votre connexion sera automatiquement inscrit dans cette transaction et SavaChanges ne va pas créer une nouvelle transaction. En outre, les transactions imbriquées ne sont pas vraiment pris en charge sur SqlServer (c'est à dire imbriquée Begin Tran sont ignorés)

OriginalL'auteur Gary McGill | 2012-10-09