【问题标题】:entity framework with oracle inserting parent with child带有oracle的实体框架插入父级和子级
【发布时间】:2012-02-03 17:45:57
【问题描述】:

我们在一个 ASP.NET 应用程序中使用 EF 4.2,该应用程序通过 Oracle 的 EF 提供程序链接到一个 Oracle 11 g 数据库。 父表称为 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();

我错过了什么?

【问题讨论】:

    标签: entity-framework-4 oracle11g


    【解决方案1】:

    在看到有关未复制 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 的概念。

    【讨论】:

      【解决方案2】:

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

      <!-- SSDL content -->
      

      下面应该是一个EntityType标签,里面是数据库表的定义。为您的 ID 列添加属性,其中包含 StoreGeneratedPattern="Identity"。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-09
        • 1970-01-01
        • 1970-01-01
        • 2015-07-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多