나는 이틀 동안 이것으로 어려움을 겪고 있으며 약간의 도움이 필요합니다. 또한 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에서 찾을 수 없습니다. 제공된 개체의 키 값이 변경 사항을 적용해야하는 개체의 키 값과 일치하는지 확인합니다. 나는 각 시도를 동시에 실행하지 않았으며 각 시도는 개별적으로 실행되었습니다.
세 번째 시도에서 마녀는 첫 번째 Do save the main table "tblAnneeFinanciere"와 약간 비슷하지만 엔티티가 "tblPeriodeFinanciere"에 추가되면 The ObjectContext 인스턴스가 삭제되어 더 이상 사용할 수 없다는 예외가 발생합니다 . 연결이 필요한 작업에 사용됩니다.
내가 뭘 잘못 했어, 어디로 가야 돼?
내 작업 환경은
윈도우 7; Visual Studio 2013; 대상 프레임 워크 버전 : 4.0; EntityFramework 버전 : 4.1
다중 계층 애플리케이션에서 EF를 사용하는 경우 엔터티는 일반적으로 변경 사항을 추적하는 컨텍스트에서 제거됩니다.
즉, 컨텍스트를 사용하고 속성을 수정하고 자식을 추가하는 경우 컨텍스트는 이러한 변경 사항을 추적 SaveChanges
하고 수행 할 작업을 알고 있습니다.
그러나 다중 계층 앱이있는 경우 엔터티는 컨텍스트에서 제거됩니다.
해야 할 일은 변경 사항을 직접 추적하는 것입니다. 그런 다음 새 컨텍스트를 인스턴스화하고 엔터티를 컨텍스트에 연결하고 연결된 엔터티와 모든 하위 항목의 상태를 설정해야합니다.
entty를 컨텍스트에 연결하기 위해 두 가지 다른 작업을 수행 할 수 있습니다.
Add()
하면 모든 항목의 상태가로 설정되고 Added
변경 사항을 저장하면 모두 새 항목 인 것처럼 처리됩니다.Attach()
. 이 경우 변경 사항을 저장할 때 수행 할 작업을 알 수 있도록 엔터티의 상태를 설정해야합니다.분리 된 엔티티 추가의 예 :
ctx.Set<TEntity>().Add(newEntity);
ctx.SaveChanges();
이것은 모든 개체가 추가 된 것처럼 전체 트리를 연결합니다.
연결이 끊긴 엔티티 수정의 예 :
var attached = ctx.Set<TEntity>().Attach(changedEntity);
ctx.Entry(attached).State = EntityState.Modified;
ctx.SaveChanges();
이것은 모든 개체가 변경되지 않은 것처럼 전체 트리를 연결합니다.
변경 사항을 추적하고 객체를 컨텍스트에 연결 한 후 다시 설정해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다