entity-framework-4 - 带有 oracle 插入父级和子级的 Entity Framework

标签 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。没有抛出异常,但没有插入 child 。

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

我错过了什么?

最佳答案

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

序列已经创建。修改 StoreGeneratedPattern 后,我必须修改触发器,以便在主键为空时触发插入。在代码中将主键设置为什么值并不重要。如果主键具有标识模式,则 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 的想法。

关于entity-framework-4 - 带有 oracle 插入父级和子级的 Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9133063/

相关文章:

sql - Oracle SQL : Is ORDER BY non unique field deterministic?

oracle - 在没有触发器的情况下管理/实现Oracle中的自动增量主键

c# - 使用 Entity Framework 4.1 的代码优先 DataService 中未解析实体

c# - 不确定如何修复这个奇怪的 Entity Framework (关系/导航)错误

entity-framework - Entity Framework 4.0 GetChanges() 等效

sql - 如何在 TOAD 的 DataGrid 中显示 sys_refcursor 数据

c# - LINQ to Entities 为实体的 child 的 child 返回错误的 ID

entity-framework - 如何在执行 entityframework.bulkinsert 时插入父子?

sql - Oracle 11g - 添加新列并设置为唯一

sql - ORA-00904 : invalid identifier in subquery (in select clause)