使用子实体保存实体

时间:2014-05-30 14:27:44

标签: vb.net entity-framework

我现在挣扎了几天,我需要一些帮助。 我还通过Google和StackOverFlow进行了很多搜索,但没有找到解决方案。

我尝试,我相信,这是一件简单的事,但我不能让我工作。

使用EntityFramework我从名为" tblAnneeFinanciere"的表中更改记录,并且还在" tblAnneeFinanciere.tblPeriodeFinanciere"中添加子记录。来自NavigationPropoerty。但我无法获得SaveChanges上下文方法来保存所有信息。

我尝试了一些不同的场景,只是为了达到不同的错误。

这是我的代码段

 Public Sub Test()
        Dim AnneesFine = New List(Of tblAnneeFinanciere)

        Using database = Informat.WPF.EF.MaitreDBEntities.GetEFConnections()

            Dim query = From data In database.tblAnneeFinanciere
                        Where data.ID = 7
                        Select data


            AnneesFine = query.ToList
        End Using

        Dim ChangedAnneeFina = AnneesFine.First
        ChangedAnneeFina.Descr = Date.Now.ToLongDateString
        ChangedAnneeFina.Poincon = Date.Now

        Dim addedRecord = New tblPeriodeFinanciere() With {
                                                            .ID = 1,
                                                            .Descr = "Test#1",
                                                            .DescrEn = "Test#1",
                                                            .NoPeriode = 10,
                                                            .pCieID = ChangedAnneeFina.CieID.Value,
                                                            .DateDebut = Date.Now,
                                                            .DateFin = Date.Now,
                                                            .pAnneeFinanciereID = ChangedAnneeFina.ID,
                                                            .Poincon = Date.Now
                                                        }

        ChangedAnneeFina.tblPeriodeFinanciere.Add(addedRecord)

        Using database = Informat.WPF.EF.MaitreDBEntities.GetEFConnections()
            ''*************************************************************
            ''First attempt
            Dim obj = database.GetObjectByKey(ChangedAnneeFina.EntityKey)
            obj = ChangedAnneeFina

            ''*************************************************************
            'Second attempt

            database.tblAnneeFinanciere.ApplyCurrentValues(ChangedAnneeFina) ' Value are correctly applied
            database.SaveChanges() '' Saving tblAnneeFinanciere work correctly but child table 'tblPeriodeFinanciere' is not updated

            '*************************************************************
            'third attempt
            ' database.tblAnneeFinanciere.ApplyCurrentValues(ChangedAnneeFina) ' Value are correctly applyed
            Dim obj2 = database.GetObjectByKey(ChangedAnneeFina.EntityKey)
            obj2 = ChangedAnneeFina

            database.tblPeriodeFinanciere.AddObject(ChangedAnneeFina.tblPeriodeFinanciere.First)

            '*************************************************************


            database.SaveChanges()

        End Using


    End Sub
  • 我的第一次尝试是将更改的实体分配给链接到上下文的引用,实体是正确保存的,但不是来自" tblAnneeFinanciere.tblPeriodeFinanciere"的子记录。

  • 第二次尝试 我使用ApplyCurrentValues调用来传输信息以进行保存,但异常提升 在ObjectStateManager中找不到具有与提供的对象的键匹配的键的对象。验证提供的对象的键值是否与必须应用更改的对象的键值匹配。 请注意,我没有同时运行每次尝试,每次尝试都是单独运行。

  • 在第三次尝试中,女巫与第一次尝试有点类似 保存主表" tblAnneeFinanciere"正确,但是当实体被添加到" tblPeriodeFinanciere"时,会引发异常,告诉我 ObjectContext实例已被处理,不能再用于需要连接的操作。

我做错了什么,我应该走哪条路?

我的工作环境是

Windows 7; Visual Studio 2013;目标框架版本:4.0; EntityFramework版本:4.1

1 个答案:

答案 0 :(得分:1)

当您在多层应用程序中使用EF时,实体将从通常跟踪其更改的上下文中删除。

即。如果您正在使用上下文,并修改属性并向其添加子项,则上下文会跟踪此更改,SaveChanges知道该怎么做。

但是,当您拥有一个多层应用程序时,该实体将脱离上下文。

您需要做的是自己跟踪更改。然后,您必须实例化一个新的上下文,将实体附加到上下文,并设置附加实体及其所有子项的状态。

你可以做两件不同的事情来将entty附加到上下文中:

  • 使用Add()将实体添加到其集合中会将所有entites的状态设置为Added,保存更改会将它们全部视为新的
  • 使用Attach()附加实体。在这种情况下,您需要设置实体的状态,以便保存更改知道该怎么做。

添加已删除实体的示例:

ctx.Set<TEntity>().Add(newEntity);
ctx.SaveChanges();

这将附加整个树,就好像所有对象都已添加

一样

修改断开连接的实体的示例:

var attached = ctx.Set<TEntity>().Attach(changedEntity);
ctx.Entry(attached).State = EntityState.Modified;
ctx.SaveChanges();

这会将整个树附加为所有对象都不变

请记住,您需要跟踪更改,并在将对象附加到上下文后将其设置回来。