2010-06-23 6 views
0

J'ai une table des personnes et une table des choses, où chaque chose est la propriété d'une personne et chaque personne a un FavoriteThing.Comment encapsuler une opération de référence circulaire dans une transaction unique en utilisant Entity Framework 4?

Persons 
    PersonID int <PK> 
    FavoriteThingID int <FK> 

Things 
    ThingID int <PK> 
    PersonID int <FK> 

Je voudrais être en mesure d'ajouter une personne et son/sa visite préférée, ainsi que la mise que PersonID de chose à la nouvelle personne, en une seule transaction, sans avoir DTC promouvoir la transaction distribuée. Enroulant l'opération dans un TransactionScope() et gérer manuellement la connexion entité ne semble pas fonctionner:

 ThingEntities ent = new ThingEntities(); 

     using (TransactionScope scope = new TransactionScope()) 
     { 
      ent.Connection.Open(); 

      Thing t = ent.CreateObject<Thing>(); 

      ent.Things.AddObject(t); 

      ent.SaveChanges(false); 

      Person p = ent.CreateObject<Person>(); 
      t.Person = p; 
      ent.Persons.AddObject(p); 
      p.FavoriteThing = t; 

      ent.SaveChanges(false); 

      scope.Complete(); 

      ent.AcceptAllChanges(); 
      ent.Connection.Close(); 
     } 

Il en résulte une exception « Impossible de déterminer un ordre valide pour les opérations à charge. » Sur la deuxième appel SaveChanges().

Existe-t-il un moyen simple de faire cela?

Merci

Répondre

0

Vous n'avez pas besoin TransactionScope pour cela. Vous pouvez le faire en un seul appel à SaveChanges, ce qui signifie une transaction.

Person p = ent.CreateObject<Person>(); 
p.FavoriteThing = ent.CreateObject<Thing>(); 
ent.Persons.AddObject(p); 
ent.SaveChanges(); 
+0

À moins de manquer quelque chose, lorsque vous le faites de cette façon, Thing.PersonID n'est pas défini. Ainsi, p.FavoriteThing pointe vers la chose nouvellement créée, mais Thing.PersonID est null. – erg39

+0

Je vois maintenant la question n'était pas tout à fait clair que je voulais que Thing.PersonID soit défini. Edité la question. – erg39

+0

Il sera défini si vous avez une contrainte FK sur la colonne et une association bidirectionnelle (et vous devriez) avec exactement le code que je donne. C'est automatique. –

Questions connexes