2009-04-19 3 views
0

읽기 전용 연산을 사용하는 한 L2SQL이 좋습니다. 필드를 변경하기 시작하면 곧바로 털이 조금 나옵니다.Linq-2-SQL을 이용한 삽입 및 업데이트

특히 두 가지 문제점이 있습니다.

먼저 임의의 수의 행이있는 표를 채우려고합니다. 스키마는 대부분 관련성이 없지만 식별 열인 'BIGINT'기본 키를 가지고 있습니다.

기본 키는 ID이므로 Table.InsertOnSubmit() 또는 Table.InsertAllOnSubmit()을 호출하기 전에 기본 키를 설정하지 않으므로 DuplicateKeyException을 생성합니다. "키가있는 엔터티를 추가 할 수 없습니다. 이미 사용 중입니다. " 모든는) 내가 먼저 필요한 행을 조회 할 경우

UPDATE dbo.someTable SET someCol = 'someValue' WHERE pkValue = 20 

은 다음 DataContext.SubmitChanges (전 someCol의 값을 변경 :

내 두 번째 관심사는 다음과 같은 SQL 문에 LINQ 동등한에 대한 필요성에서 비롯된 벌금. 그러나 먼저 행을 쿼리 할 필요가없는 솔루션을 찾고 있습니다. 즉, 기본 키가 알려진 수량 인 경우이 키를 어떻게 실행할 수 있습니까?

답변

1

Jose가 지적한 질문을 살펴보면, 나는 그것이 동일한 객체를 두 번 삽입하려고 시도 할 때 사람들이 얻는 오류를 얻는다는 것을 알 수 있습니다. (첫 번째 삽입물은 ID를 집어 넣을 것입니다. 두 번째 업데이트는 방금 생성 된 ID를 삽입합니다.); 두 번 (또는 그 이상) 제출을 위해 동일한 객체에 태그를 붙일 수 있습니까? 당신은 "임의의 수의 행"을 삽입한다고 말했습니까? 식별 컬럼이 값이 채워하지 말았어야 당신은 그것을 얻을 수 InsertOnSubmit()와 SubmitChanges를 호출

을 두 번째에 관해서는 -

기본적으로, 당신이 그것에 대해 이야기로 Linq은 SQL 상황을 처리해야합니다. 질문, 나는 Linq SQL에 당신이 원하는 일을하는 명시적인 방법이 있다고 생각하지 않습니다. 아마도 가장 쉽고/좋은 해결책은 원하는 데이터를 업데이트하는 sproc를 가지고 Linq to SQL (업데이트 할 레코드 ID 전달)을 사용하여 호출하는 것입니다.

+0

당신은 아주 잘 두 번째 부분에 잘 될 수 있습니다. SPROC에 관해서는 거의 알지 못해서 그 해결책을 생각하기에 앞서 스스로를 배워야 할 것입니다. – Kivin

0

첫 번째 질문 : PK가 DB에 의해 자동 증가 되었습니까?

두 번째 질문의 경우 올바르게 이해하면 다음 도움말이 도움이됩니다 (L2S에 대한 MSDN FAQ에서 가져옴). 내가 먼저 데이터베이스를 쿼리하지 않고 테이블 데이터를 업데이트 할 수

Q. : 나는 ;-) MSDN 나쁜 경험을 가지고 당신은 다음을 테스트해야합니까? SQL 코드를 전송

사용 ExecuteCommand를 : SQL에 LINQ하지만

A. 먼저 질의없이 업데이트하려면 다음 방법 중 하나를 를 사용할 수 세트 기반 업데이트 명령이 없습니다.

개체의 새 인스턴스를 만들고 업데이트에 영향을 미치는 모든 현재 값 (필드)을 초기화합니다. 그런 다음 Attach를 사용하여 DataContext 에 개체를 연결하고 변경할 필드 을 수정하십시오.

참고 : 쿼리하지 않고 업데이트하려면 DataContext에 이미로드 된 동일한 개체가 없는지 확인해야합니다.

1

내 질문에 대한 답을 찾았습니다.

먼저 중복 키가있는 문제는 내 테이블이 Designer에서 잘못 가져온 결과입니다. 서버 탐색기에서 연결을 삭제하고 처음부터 시작 했으므로이를 해결했습니다.

둘째, 나는 다음과 같은 코드 샘플 내 두 번째 문제를 해결 것으로 확인되었습니다 :

using(var dc = new MyDataContext()) 
{ 
    TableValue row = new TableValue(); 
    row.pkValue = 20; 
    dc.TableValues.Attach(row); // DataContext thinks 'row' is the original. 

    row.someCol = "Changed Value"; // DataContext formats an UPDATE statement 
    dc.SubmitChanges(); 
} 

이것에주의해야 할 점은 내가 '내 모든 테이블 컬럼의'업데이트 확인 '속성을 안 함으로 설정해야한다는 것입니다 '또는 예외를 던집니다. 이것은 나를 조금 불편하게 느끼게하고, 이것이 최선의 해결책이 아니라고 믿게합니다.하지만 그것은 부분적으로 '업데이트 체크'속성의 실제 목적에 대한 이해가 부족할 수 있습니다. 두 번째 문제에 대응

0

:

DataContext.someTable.Where(a => a.pkValue == 20).SingleOrDefault().someCol = 'someValue'; 
DataContext.SubmitChanges();