实体框架与oracle插入父与子

时间:2012-02-03 17:45:57

标签: entity-framework-4 oracle11g

我们在与Oracle的EF提供商链接到Oracle 11 g数据库的ASP.NET应用程序中使用EF 4.2。 父表名为CASE_PHASE,并具有一个名为ID的主键。子表名为CASE_STAGE,并具有一个名为ID的主键。插入前插入触发器的两个主键。这个question意味着触发可能是问题。

这段代码看起来像我在Julia Lerman的书中找到的样本,但只插入一个新的CASE_PHASE。抛出没有异常,但未插入子项。

//from the controllers CREATE with hard coded values for testing purposes
        // POST: /CasePhase/Create

        [HttpPost]
        public ActionResult Create(CASE_PHASE case_phase)
        {


            var caseStage = new CASE_STAGE
                                {
                                    CREATED_BY_USER_ID = 1604,
                                    LAST_MODIFIED_BY_USER_ID = 1604,
                                    CURRENT = 1,
                                    STAGE_ID = 1752,
                                    DATE_CREATED = DateTime.Now,
                                    DATE_LAST_MODIFIED = DateTime.Now
                                };

            if (ModelState.IsValid)
            {
                //join new stage to phase
                caseStage.CASE_PHASE = case_phase;
                //attach linked entities to context
                //debugging shows case_phase has the values it needs   
                //but caseStage does not
                db.CASE_PHASE.Attach(case_phase);
                db.CASE_PHASE.Add(case_phase);
                db.SaveChanges();

我错过了什么?

2 个答案:

答案 0 :(得分:3)

在看到有关StoreGeneratedPattern =" Identity"的更改的错误后,我确保Visual Studio有Service Pack 1。不被复制。现在可以在模型中正确识别所有主键。

已创建序列。在修改StoreGeneratedPattern之后,我不得不修改触发器,以便在主键为null时触发插入。在代码中设置主键的值并不重要。如果主键具有Identity模式,则EF不会将值发送到数据库。

这可行,但它是一个愚蠢的,两个提交一个链接的交易

        if (ModelState.IsValid)
        {   
            //add the parent entity
            db.CASE_PHASE.Add(case_phase);
            db.SaveChanges();
            //add new child
            var caseStage = new CASE_STAGE();
            //...more variables initialized 
            //and add the foreign key to the child
            caseStage.CASE_PHASE_ID = case_phase.ID;
            db.CASE_STAGE.Add(caseStage);
            db.SaveChanges();
            return RedirectToAction........
         }

使用ADO DBContext和Oracle Entity Framework Beta(我不希望生产版本中出现不同的行为,因为Oracle使用的触发器/序列理念似乎与EF不能很好地混合。

或者,您可以将ID字段保留为StoreGeneratedPattern的默认设置,然后使用Database.SqlQuery直接从数据库获取主键。将其添加到父级,然后将其作为外键添加到子级。

你可以选择:一个选择序列来自dual和一个db.SaveChanges,它们至少遵循原子事务或两个db.SaveChanges的想法。

答案 1 :(得分:0)

使用XML编辑器打开.edmx文件,并查找以下行开头的部分:

<!-- SSDL content -->

下面应该是一个EntityType标记,其中包含数据库表的定义。添加ID列的属性中包含StoreGeneratedPattern =“Identity”。