데이터베이스에서 연결이 끊어진 엔터티를 Linq에서 어떻게 업데이트할 수 있나요?
문제
아래 코드가 올바르게 실행되지 않고 오류가 발생합니다. InvalidOperationExcepiton
.
public void Foo()
{
DataContext context = new DataContext();
LinqEntity item = new LinqEntity(){ Id = 1, Name = "John", Surname = "Doe"} ;
context.LinqEntities.Attach(item, true);
}
해결책
기본적으로 엔터티는 편집 시 동시성을 확인하기 위해 모든 필드를 사용합니다.이것이 InvalidOperationException을 발생시키는 것입니다.
모든 필드에 대한 업데이트 확인 속성을 안 함으로 설정할 수 있습니다.엔터티를 수정된 대로 연결하려면 모든 필드에서 이 작업을 수행해야 합니다.이 작업이 완료되면 context.SubmitChanges()에 대한 추가 호출이 데이터를 저장합니다.
또는 원래 값을 알고 있는 경우 첨부한 다음 업데이트할 수 있지만 확인 중인 모든 값은 원래 값과 일치해야 합니다.
LinqEntity item = new LinqEntity(){ Id = 1, Name = "OldName", Surname = "OldSurname"};
context.LinqEntities.Attach(item);
item.Name = "John";
item.Surname = "Doe";
context.SubmitChanges();
다른 팁
데이터베이스와의 연결이 끊어졌다는 것이 무슨 뜻인지 잘 모르겠습니다.
LinqEntities 테이블에 새 행을 삽입하려고 하는 것 같습니다. 맞습니까?
그렇다면 당신은 그렇게 하고 싶을 것입니다.
context.LinqEntities.InsertOnSubmit(item);
context.Submit();
좋습니다. ID = 1인 행을 업데이트하려는 경우 다음과 같이 하면 됩니다.
DataContext context = new DataContext();
LinqEntity item = (from le in context.LinqEntities
where le.ID == 1
select le).Single();
item.Name = "John";
item.Surname = "Doe";
context.Submit();
Linq 표현식을 보다 간결한 람다로 바꿀 수도 있습니다.
LinqEntity item = context.LinqEntities.Single(le => le.ID == 1);
DataContext가 수행하는 가장 중요한 작업은 모든 변경 사항을 추적하는 것입니다. 그러면 Submit 메서드를 호출할 때 변경된 항목에 대한 Insert 문이 자동 생성됩니다.
ORM을 사용할 때 일반적으로 객체를 업데이트하기 전에 객체를 선택합니다.
당신이 사용할 수있는 DataContext.ExecuteCommand(...)
선택을 원하지 않는 경우 ORM을 우회합니다.