[entity-framework] Entity Framework : “저장소 업데이트, 삽입 또는 삭제 문이 예기치 않은 행 수 (0)에 영향을 미쳤습니다.” [닫은]

Entity Framework를 사용하여 그리드 컨트롤을 채우고 있습니다. 때때로 업데이트 할 때 다음 오류가 발생합니다.

저장소 업데이트, 삽입 또는 삭제 문이 예기치 않은 행 수 (0)에 영향을 미쳤습니다. 엔터티가로드 된 후 엔터티가 수정되거나 삭제되었을 수 있습니다. ObjectStateManager 항목을 새로 고칩니다.

이것을 재현하는 방법을 알 수 없습니다. 그러나 업데이트를 얼마나 가깝게 수행하는지와 관련이 있습니다. 누구든지 이것을 보았거나 오류 메시지가 무엇을 의미하는지 아는 사람이 있습니까?

편집 : 불행히도 나는이 프로젝트에서 물러 났고 궁극적으로 솔루션을 찾았는지, 다른 개발자가 해결했는지, 또는 해결했는지 여부를 기억하지 못하기 때문에 더 이상 자유의 여지가 없습니다. 그러므로 나는 어떤 대답도 받아 들일 수 없습니다.



답변

그것은 낙관적 동시성이라는 기능의 부작용입니다.

Entity Framework에서 켜거나 끄는 방법을 100 % 확신하지 못하지만 기본적으로 데이터베이스에서 데이터를 가져 오는 시점과 변경 사항을 저장 한 시점 사이에 다른 사람이 데이터를 변경 한 시점 사이에 저장하려면 0 행이 실제로 업데이트되었습니다). SQL 용어로 update쿼리where 절에는 행에있는 모든 필드의 원래 값이 포함되며 0 개의 행이 영향을받는 경우 무언가 잘못되었음을 알 수 있습니다.

그 뒤에 아이디어는 응용 프로그램이 알지 못했던 변경 사항을 덮어 쓰지 않을 것이라는 것입니다. 기본적으로 모든 업데이트에서 .NET에 의해 발생하는 약간의 안전 조치입니다.

일관성이 있다면 자신의 논리 (EG : 실제로 선택과 업데이트 사이의 다른 방법으로 데이터를 직접 업데이트하고 있음) 내에서 발생할 가능성이 있지만 두 응용 프로그램 간의 경쟁 조건 일 수 있습니다.


답변

이 문제가 발생하여 엔티티의 ID (키) 필드가 설정되지 않아 발생했습니다. 따라서 컨텍스트가 데이터를 저장하려고 할 때 ID = 0을 찾을 수 없습니다. 업데이트 명령문에 중단 점을 배치하고 엔티티의 ID가 설정되었는지 확인하십시오.

Paul Bellora의 의견에서

.cshtml 편집 페이지에 숨겨진 ID 입력을 포함시키는 것을 잊어 버리기 때문에이 정확한 문제가 발생했습니다.


답변

와우, 많은 답변이지만 다른 언급이없는 약간 다른 것을했을 때이 오류가 발생했습니다.

간단히 말해서, 새 객체를 만들고 EF에 객체를 사용하여 수정했다고 알려 EntityState.Modified주면 데이터베이스에 아직 존재하지 않으므로이 오류가 발생합니다. 내 코드는 다음과 같습니다.

MyObject foo = new MyObject()
{
    someAttribute = someValue
};

context.Entry(foo).State = EntityState.Modified;
context.SaveChanges();

그렇습니다. 이것은 어리석은 것처럼 보이지만 foo이전에 전달 된 방법이 이전에 생성 되었기 때문에 발생 someValue했습니다 foo.

쉽게 고쳐, 단지 변화 EntityState.ModifiedEntityState.Added또는 변경이 전체 라인 :

context.MyObject.Add(foo);


답변

나는이 같은 끔찍한 오류에 직면했다 … 🙂 그런 다음 나는 설정하는 것을 잊고 있다는 것을 깨달았다.

@Html.HiddenFor(model => model.UserProfile.UserId)

업데이트되는 객체의 기본 키! 나는이 단순하지만 매우 중요한 것을 잊는 경향이있다!

그건 그렇고 : HiddenForASP.NET MVC입니다.


답변

GridView에서 “DataKeyNames”속성을 잊었는지 확인하십시오. GridView 내에서 데이터를 수정할 때 필수입니다.

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.datakeynames.aspx


답변

이 문제는 다음 두 가지 중 하나에 의해 발생합니다.

  1. 하나 이상의 속성이 Concurrency Mode: Fixed.. 인 행을 업데이트하려고 시도 했으며 낙관적 동시성으로 인해 데이터가 저장되지 않았습니다. 즉. 일부는 서버 데이터를 수신 한 시간과 서버 데이터를 저장 한 시간 사이에 행 데이터를 변경했습니다.
  2. 행을 업데이트하거나 삭제하려고했지만 해당 행이 없습니다. 검색 후 저장 사이에 데이터를 변경 (이 경우 제거)하는 다른 예는 저장하지 않거나 Identity (예 :)가 아닌 필드를 업데이트하려고하면 StoreGeneratedPattern = Computed행이 존재하지 않습니다.

답변

PK의 일부가 datetime 열이고 삽입 된 레코드가 DateTime.Now를 해당 열의 값으로 사용했기 때문에이 같은 오류가 발생했습니다. 엔터티 프레임 워크는 밀리 초 정밀도로 값을 삽입 한 다음 밀리 초 정밀도로 방금 삽입 한 값을 찾습니다. 그러나 SqlServer는 값을 두 번째 정밀도로 반올림하여 엔티티 프레임 워크가 밀리 초 정밀도 값을 찾을 수 없었습니다.

해결책은 삽입하기 전에 DateTime.Now에서 밀리 초를 자르는 것이 었습니다.