2013-11-29 2 views
4

저는 EF 6.0 및 코드 우선 접근 방식을 사용하고 있습니다. Entity Framework를 통해 db에서 데이터를 만들고 업데이트하는 데 문제가 있습니다. 나는 학생을 저장하기 전에 db.Groups.Attach(student.Group)을 만들 필요가 있는지 확실하지 않습니다. 학생을 구한 후에이 이름이 없으면 같은 이름이지만 다른 GroupId를 가진 새로운 그룹도 생깁니다. 나는 예외를 받고 있어요 때문에Entity Framework : WPF에서 관련 개체 생성 및 업데이트

또한 나는 학생을 업데이트 할 수 없습니다 : The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects.

public class Student { 
    [Key] 
    public int StudentId {get; set;} 
    public string Name {get; set;} 
    public Group Group {get; set;} 
} 
public class Group { 
    [Key] 
    public int GroupId{ get; set;} 
    public string Name {get; set;} 
    public virtual ICollection<Student> Students {get; set;} 
} 

합니다. 내가 엔티티에하지만 난 그냥 그룹을 변경할 수 없습니다 기억 것과 일부터

public class StudentDao { 
    public void createStudent(Student student) { 
     using (var db = new StorageContext()) { 
      // without this also creates new Group. 
      db.Groups.Attach(student.Group);  
      db.Students.Add(student); 
      db.SaveChanges(); 
     } 
    } 

    public void updateStudent(Student student) { 
     using (var db = new StorageContext()) { 
      var original = db.Students.Find(student.StudentId); 
      if (original != null) { 
       original.Name = student.Name; 
       original.Group = student.Group; 
       db.SaveChanges(); //exception 
      } 
     } 
    } 
} 

답변

2

(db.Groups.Attach (student.Group)를) 학생을 저장 한 후 나는 또한

AddDbSet마르크에 엔티티를 보내고 있기 때문이다

모든 부착 새로운 그룹을 추가 된 컨텍스트에 의해 아직 추적되지 않은 엔티티. 이것은 마치 EF 기능과 같거나 그렇지 않으므로 다시 삽입하지 않으려는 엔티티를 먼저 첨부해야합니다. 나는 학생의 그룹이 여전히 문맥에 부착 된 업데이트 방법, 어떤 이유로 예외

을 얻고 있기 때문에

또한 나는 학생을 업데이트 할 수 없습니다. 분명히 StudentDao 클래스에 다른 컨텍스트가 활성화되어 있습니다. 학생을 업데이트 할 때이 문맥의 수명이 끝났는지 확인해야합니다. 그렇지 않으면 학생과 그룹을 학생과 그룹에서 분리합니다 (두 번째).

주제를 벗어난 조언 : 가능한 경우이 DAO 패턴을 포기하십시오. EF는 DbContextDbSet을 하나의 작업 단위를 처리하는 서비스와 같은 방법으로 사용할 때 훨씬 잘 작동합니다. 이 DAO를 사용하면 트랜잭션으로 작업하는 것이 불가능하며 반복되는 코드 더미가 생깁니다.

+0

답장을 보내 주셔서 감사합니다. "서비스와 유사한 메소드에서 DbContext와 DbSets 사용"은 무엇을 의미합니까? 한 클래스에 하나의 dbcontext가 있다는 것을 의미합니까? 기사를 언급하도록 정교 할 수 있습니까? – Amir

-1

은 오랜만, 당신은 학생을 업데이트 /뿐만 아니라 그것을 대신하고 다시로드 변화를 그룹 ID 필드를 제공해야 개체를 데이터베이스에서 가져 와서 Group 개체가 동일한 컨텍스트 내에서로드되고 할당되도록합니다.

이것은 NHibernate를 사용하는 이유 중 하나 일뿐입니다. 이없이

+0

그래서 Group 대신 GroupId를 변경해야합니까? 그 말은 학생 그룹에서 Group과 GroupId를 가져야한다는 뜻입니까? – WojciechKo

+0

예. 적어도 그것이 내가 과거에 해왔 던 Entity Framework 프로젝트에서 어떻게 설정되었는지 보았습니다. –

관련 문제