我现在挣扎了几天,我需要一些帮助。 我还通过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
答案 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();
这会将整个树附加为所有对象都不变
请记住,您需要跟踪更改,并在将对象附加到上下文后将其设置回来。