0

我正在开发 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(需要 a T_RIGRIGHT)。

希望我的解释足够清楚

有什么办法让它工作吗?

PS:我为我的英语道歉,因为它不是我的母语。

4

1 回答 1

1

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

RIGID = entity1.RIGID,

如果您仔细查看 entity1,您将看到 RIGID默认情况下为 0 - 相反,您应该设置表示 FK 关系的导航属性:

RIG = entity1,

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

同样在您的场景中,您不需要TransactionScope- EF 在内部使用事务SaveChanges()- 根据建议的更改,您只需要一次SaveChanges()调用,因此不需要外部事务范围。

于 2011-09-12T15:59:57.223 回答