1

DB 첫 번째 방법 인 EF 4.1에서 DbContext POCO 코드 gen을 사용하고 있습니다.또 다른 다 대다 합병증 - Entity Framework 4.1 DbContext

내 데이터베이스가있는 다 대다 관계 아래와 같이

직원

계정

을 계정 아이디 EmployeeName를 직원 ID 16,

계정 이름

EmployeeAccount

이 문제는 내가 직원을 업데이트하려고하고, 사전에 기존 계정에 자신의 계정 지정을 변경, 그래서하고 경우에 발생

을 계정 아이디를 직원 ID 기본적으로 아래와 같이합니다 :

using(context) 
{ 
    var query = from e in context.Employees.Include(f => f.Accounts) 
       where e.EmployeeId == employeeId 
       select; 

    Employee emp = query.FirstOrDefault() 
} 

emp.EmployeeName = "Test"; 

emp.Accounts.Clear(); 

Account act = MethodThatLooksUpAccountByName("SomeAccountName"); 

emp.Accounts.Add(act); 

using(context) 
{ 
    context.Accounts.Attach(act); 

    emp.State = EntityState.Modified; 

    context.Employees.Attach(emp); 

    context.SaveChanges(); 
} 

생성되는 SQL이 [Employee] 테이블에 대한 업데이트를 실행하고 [EmployeeAccount]에 대한 업데이트가 없으며 삭제가 없습니다.

답변

1

마지막 (최소) Attach을 제거하십시오. 당신은 또한 당신이 첨부 된 시나리오에 있기 때문에 Modified에 상태를 설정해야합니다 (emp이 DB에서로드) 및 추적이 변화를 무슨 짓을했는지 인식 변경하지 마십시오 :

var query = from e in context.Employees.Include(f => f.Accounts) 
      where e.EmployeeId == employeeId 
      select; 
Employee emp = query.FirstOrDefault() 

emp.EmployeeName = "Test"; 
emp.Accounts.Clear(); 

Account act = MethodThatLooksUpAccountByName("SomeAccountName"); 
// next line is only necessary if MethodThatLooksUpAccountByName 
// uses another context. If it uses the same context you can remove this line. 
context.Accounts.Attach(act); 

emp.Accounts.Add(act); 

context.SaveChanges(); 

이 내 의견에 작동합니다.

편집 당신은 문제의 코드를 변경 후 :

두 번째 상황은 자신의 변경 내용 추적을 수행합니다. 따라서 계정을 삭제하고 새 계정을 추가했음을 인식하지 못합니다. 그것은 다음과 같은 방식으로 작동해야합니다 :

using(...context...) 
{ 
    var query = from e in context.Employees.Include(f => f.Accounts) 
       where e.EmployeeId == employeeId 
       select; 

    Employee emp = query.FirstOrDefault() 
} 

Account act = MethodThatLooksUpAccountByName("SomeAccountName"); 

using(...context...) 
{ 
    context.Employees.Attach(emp); 
    context.Accounts.Attach(act); 

    emp.EmployeeName = "Test"; 
    emp.Accounts.Clear(); 
    emp.Accounts.Add(act); 

    context.SaveChanges(); 
} 

나는 그것이 당신이 원하는 것이 아닙니다. 마지막 컨텍스트에서 분리 된 상태에서 직원의 변경 (기존 계정 삭제 및 새 계정 추가)을 수행 했습니까? many-to-many 컬렉션의 문제는 은 이전 Account 컬렉션을 지우거나 첨부하려는 컨텍스트에 컬렉션을로드하거나 첨부해야한다는 것입니다. 스칼라 속성을 설정하거나 임의의 엔터티에 상태를 설정하여 링크 테이블에서 DELETE 또는 INSERT 문을 트리거하는 방법은 없습니다. 콜렉션의 변경 사항 만 감지하면 EF가 링크 테이블을 갱신합니다.

+0

사과드립니다. 상황을 올바르게 나타내지 못했습니다. 컨텍스트가 linq 문 다음에 처리되므로 첨부 된 시나리오가 아닙니다. 편집 된 질문보기 – EkoostikMartin

+0

@EkoostikMartin : 답변을 업데이트했습니다. – Slauma

+0

감사합니다, 그 작품, 또한 내게 어떤 EF 개념의 더 나은 이해를 준다.EF는 단절된 엔티티로 작업하는 것을 어렵게 만드는 중요하지 않은 문제를 가지고있는 것처럼 보입니다. 데이터 모델 및 운영 요구 사항이 더욱 복잡해지면서 데이터 모델이 더욱 악화 될까 봐 걱정됩니다. – EkoostikMartin

관련 문제