2016-07-28 5 views
0

여기 내 prblemEF 핵심 인 removeRange 항목

using (var db = new CassaContext()) {   
     var DbSet = db.GetByName(item.Name); 
     DbSet.RemoveRange(DbSet); 

     for (var i = 0; i < data.Count; i++) 
     { 
      JObject jitem = data[i] as JObject; 
      var dbobj = vm.Db.JsonToObject(jitem);    
      DbSet.Add(dbobj); 
     } 

     db.SaveChanges(); 
} 

내가 removeRange를() istruction 후 db.SaveChanges()를 추가 할 경우, 모든 것을하지 않고, 나는 오류를 가지고 괜찮지 만의 트랜잭션에 제거되지

개체 유형의 인스턴스는 '사용자'는 이미 가 추적되고 동일한 키와 때문에이 유형의 다른 인스턴스를 추적 할 수 없습니다. 새 항목을 추가 할 때 키가 설정되지 않은 경우 (즉, 속성에 해당 유형의 기본값이 할당 된 경우) 대부분의 키 유형에 대해 임시 키 값이 생성됩니다. 새 엔터티에 대한 키 값을 명시 적으로 설정하는 경우 이 기존 엔터티와 충돌하거나 다른 새 엔터티에 대해 생성 된 임시 값과 충돌하지 않는지 확인하십시오. 기존 엔티티를 첨부 할 때는 지정된 키 값을 가진 하나의 엔티티 인스턴스 만 컨텍스트에 연결되어 있는지 확인하십시오.

트랜잭션이 실패한 경우 빈 테이블이 없기 때문에 removerange 이후에 저장하지 않으려합니다.

어떻게 해결할 수 있습니까? 미리 감사드립니다! 더 많은 정보가 필요하면 꼭 물어보십시오!

+0

예외는 매우 분명하다 : * 동일한 키를 가진이 유형의 다른 인스턴스가 이미 * 추적하고있다. 방금 제거한 엔티티를 추가합니다. –

+0

그리고 무엇이 문제입니까? EF7에서도 작업하고있었습니다. 데이터베이스에 엔티티를 삽입하고 제거 할 수 있다고 가정합니다. – thepasto

답변

2
이 오류에 대한 확실하지

,하지만 당신은 명시 적 트랜잭션을 사용하여 시도 할 수 :

using (var db = new CassaContext()) 
using (var transaction = db.Database.BeginTransaction()) 
{ 
    var DbSet = db.GetByName(item.Name); 
    DbSet.RemoveRange(DbSet); 
    db.SaveChanges(); 

    for (var i = 0; i < data.Count; i++) 
    { 
     JObject jitem = data[i] as JObject; 
     var dbobj = vm.Db.JsonToObject(jitem);    
     DbSet.Add(dbobj); 
    } 
    db.SaveChanges(); 

    transaction.Commit(); 
} 
+0

고마워요! 그것은 일을한다! 그것은 트랜잭션 오류에도 잘 작동하는 것 같습니다. EF7에서 작동했기 때문에 명시 적 트랜잭션을 사용하지 않을 것이라고 생각했습니다. 다시 한 번 감사드립니다. – thepasto