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
À 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
Je vois maintenant la question n'était pas tout à fait clair que je voulais que Thing.PersonID soit défini. Edité la question. – erg39
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. –