2

여기 상황이다, 나는 다음과 같은 관계를 맺고있는 세 가지 요소를 가지고있다. 그러나 편집 메서드를 만들려고하면 부모 개체 만 수정 한 후에 저장됩니다. 내가 지금까지 가지고있는 것을 아래에서 보라.EF 5 N 레벨 딥 개체 그래프 업데이트 중? 나는 문제없이 이러한 개체를 생성, 추가 및 저장 관리해야</p> <pre><code>-Team one-to-one TeamContact -TeamContact one-to-one TeamAddress </code></pre> <p>:

내 DB 클래스의 저장 방법

public void SaveTeam(Team team) 
    { 
     if (team.Id == 0) 
     { 
      context.Teams.Add(team); 
     } 
     else 
     { 
      var model = context.Teams.Find(team.Id); 
      context.Entry(model).CurrentValues.SetValues(team); 
     } 
     context.SaveChanges(); 
    } 

편집 방법

[HttpGet] 
    public ActionResult Edit(int id) 
    { 
     var model = _dataSource.Teams.FirstOrDefault(t => t.Id == id); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Edit(Team team) 
    { 
     if (ModelState.IsValid) 
     { 
      _dataSource.SaveTeam(team); 

      return RedirectToAction("Detail", "Team", new { id = team.Id }); 
     } 
     return View(team); 
    } 

내가 내가 내가 부모 개체를 수정할 수 있습니다 만 무엇을, 위에서 말했듯이, 내가 놓친 무슨이 이리?

Violation of PRIMARY KEY constraint 'PK_dbo.TeamAddresses'. Cannot insert duplicate key  in object 'dbo.TeamAddresses'. The duplicate key value is (5). 
The statement has been terminated. 

결론은 어떻게합니까 하나의 업데이트 N 수준 깊은 객체 :

내가 위를 시도한 후이 오류가 발생했습니다

public void SaveTeam(Team team) 
    { 
     if (team.Id == 0) 
     { 
      context.Teams.Add(team); 
     } 
     else 
     { 
      //var model = context.Teams.Find(team.Id); 
      var model = context.Teams.Include(c => c.TeamContact).Single(t => t.Id == team.Id); 
      context.Entry(model).CurrentValues.SetValues(team); 
      model.TeamContact = team.TeamContact; 
     } 
     context.SaveChanges(); 
    } 

을 시도 ?

답변

5

길게 검색하고 읽은 후 마침내 내가 의도 한 바를 알게되었습니다. 나는 N-Level 딥 오브젝트 그래프를 생성하고 저장하는 것이 그 오브젝트 업데이트만큼 어렵지는 않았다. 어쨌든, Danny Varod의 코멘트를 읽은 후 다시 돌아가 DbContext에 대해 자세히 알아보기로 결정했습니다. 아래는 내가하려고했던 것입니다. 또한 새로운 방법으로 동일한 객체를 저장하는 방법을 사용 중입니다.

public void SaveTeam(Team team) 
    { 
     if (team.Id == 0) 
     { 
      context.Teams.Add(team); 
     } 
     else if (team.Id > 0) 
     { 
      //This Updates N-Level deep Object grapgh 
      var currentTeam = context.Teams 
       .Include(c => c.TeamContact) 
       .Include(a => a.TeamContact.TeamAddress) 
       .Single(t => t.Id == team.Id); 

      context.Entry(currentTeam).CurrentValues.SetValues(team); 
      currentTeam.TeamContact.TeamAddress = team.TeamContact.TeamAddress; 
      currentTeam.TeamContact = team.TeamContact; 
     } 
     context.SaveChanges(); 
    } 
+0

설명의 요점. 주석 처리 된 행은 오브젝트를 갱신하지 않습니다. 오히려 데이터베이스에서로드하여 컨텍스트로 등록합니다. EF로 하여금 그들이 바뀌 었음을 깨닫게하고 그에 따라 업데이트하는 것은 등록입니다. –

2

제공된 엔티티에서 도달 할 수있는 전체 그래프를 첨부하는 것과는 달리, 적용 변경은 제공된 엔티티에만 변경 사항을 적용하며 수정해야하는 연결 엔티티도 알지 못합니다.

각 엔티티에 대해 변경 사항 적용을 호출해야합니다.

+0

감사합니다. 위의 내용을 살펴보고 방금 시도한 내용을 확인하십시오. 또한 설명과 함께 예제를 제공하면 도움이 될 수 있습니다. – Komengem