如何使用Entity Framework 4在单个事务中包装循环引用操作?

时间:2010-06-23 18:16:56

标签: entity-framework transactions

我有一个人员表和一个物品表,其中每个人都拥有一个人,每个人都有一个喜欢的人。

Persons
   PersonID int <PK>
   FavoriteThingID int <FK>

Things
   ThingID int <PK>
   PersonID int <FK>

我希望能够在单个事务中添加Person和他/她最喜欢的Thing,以及将Thing的PersonID设置为新Person,而不会让DTC将事务提升为分发。在TransactionScope()中包装操作并手动管理实体连接似乎不起作用:

        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();
        }

这导致第二次SaveChanges()调用中的“ 无法确定依赖操作的有效排序。 ”异常。

有一种简单的方法吗?

由于

1 个答案:

答案 0 :(得分:0)

您不需要TransactionScope。您可以通过一次调用SaveChanges来执行此操作,这意味着一次交易。

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