TransactionScope与依赖对象上的Object上下文

时间:2011-09-12 15:53:24

标签: entity-framework oracle11g transactionscope objectcontext

我正在开发一个MVC3应用程序,我正在使用链接到Oracle数据库(11G R2)的实体框架。 当我尝试在TransactionScope内使用单个对象上下文时,我遇到了一个问题。

以下是代码:

using (TransactionScope scope = new TransactionScope())
{
    using (Entities context = new Entities())
    {
        // Right insert
        T_RIGRIGHT entity1 = new T_RIGRIGHT()
        {
            RIGCODE = "test1",
            RIGINSERTLOGIN = "aco",
            RIGINSERTDATE = DateTime.Now,
            RIGUPDATELOGIN = "aco",
            RIGUPDATEDATE = DateTime.Now
        };

        context.AddToT_RIGRIGHT(entity1);

        context.SaveChanges();

        // Right/Profile insert
        T_RIPRIGHTPROFILE entity2 = new T_RIPRIGHTPROFILE()
        {
            PROID = 3,
            RIGID = entity1.RIGID,
            RIPINSERTLOGIN = "aco",
            RIPINSERTDATE = DateTime.Now,
            RIPUPDATELOGIN = "aco",
            RIPUPDATEDATE = DateTime.Now
        };

        context.AddToT_RIPRIGHTPROFILE(entity2);

        context.SaveChanges(); // SaveChanges fails due to the FK constraint on table 
    }

    scope.Complete();
}

让我解释一下代码......

首先,我创建一个名为entity1的实体作为T_RIGRIGHT元素。 我实例化T_RIPRIGHTPROFILE元素,该元素使用之前创建的T_RIGRIGHT元素的id。

第二个context.SaveChanges()上的执行失败,并且该异常涉及表T_RIPRIGHTPROFILE上的外键约束(需要T_RIGRIGHT)。

希望我的解释足够清楚

有什么方法可以使它有效吗?

P.S。 :我为我的英语道歉,因为这不是我的母语。

1 个答案:

答案 0 :(得分:1)

您正在尝试分配尚未提交给数据库的实体的FK entity1.RIGID

RIGID = entity1.RIGID,

如果仔细查看entity1,您会看到RIGID默认为0 - 而应设置表示FK关系的导航属性:

RIG = entity1,

这将使EF能够正确地关联这些实体,因为这个实体1还不必提交给数据库,因此您甚至不需要额外的SaveChanges()调用。

同样在您的方案中,您不需要TransactionScope - EF已在SaveChanges()内部使用了一项交易 - 根据建议的更改,您只需要SaveChanges()次调用,因此无外部需要交易范围。