我正在开发一个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。 :我为我的英语道歉,因为这不是我的母语。
答案 0 :(得分:1)
您正在尝试分配尚未提交给数据库的实体的FK entity1.RIGID
:
RIGID = entity1.RIGID,
如果仔细查看entity1,您会看到RIGID
默认为0 - 而应设置表示FK关系的导航属性:
RIG = entity1,
这将使EF能够正确地关联这些实体,因为这个实体1还不必提交给数据库,因此您甚至不需要额外的SaveChanges()
调用。
同样在您的方案中,您不需要TransactionScope
- EF已在SaveChanges()
内部使用了一项交易 - 根据建议的更改,您只需要SaveChanges()
次调用,因此无外部需要交易范围。