2008-10-29 2 views
2
// goal: update Address record identified by "id", with new data in "colVal" 

string cstr = ConnectionApi.GetSqlConnectionString("SwDb"); // get connection str 
using (DataContext db = new DataContext(cstr)) { 
    Address addr = (from a in db.GetTable<Address>() 
        where a.Id == id 
        select a).Single<Address>(); 
    addr.AddressLine1 = colValue.Trim(); 
    db.SubmitChanges(); // this seems to have no effect!!! 
} 

를 업데이트하지 LinqToSQL, 나는 의해 AddressLine1 내가 db.SubmitChanges()를 호출하기 직전에 변경되는 것을 확인할 수 있습니다 SubmitChanges 라인이 실행될 때 "재설정 연결". 누구나 이것이 작동하지 않는 이유를 알 수 있습니까? 감사!는 요지의 DB 테이블의 모든 현재 값이 디버거에서 데이터베이스

답변

6

GetChangeSet 방법을 사용하면 제출 된 변경 사항을 빠르게 볼 수 있습니다.

또한 테이블에 기본 키가 정의되어 있고 매핑이이 기본 키에 대해 알고 있는지 확인하십시오. 그렇지 않으면 업데이트를 수행 할 수 없습니다.

+0

테이블에 기본 키가 필요하다는 것을 알지 못했습니다. 나는 changetracking이 작동하지 않는 이유를 알아 내려고 꽤 오랫동안 벽에 머리를 때렸다. 이 답변을 주셔서 감사합니다! –

1

웃기는, GetTable과 Single을 사용하는 것. 코드가 다음과 같이 표시 될 것으로 예상했을 것입니다.

string cstr = ConnectionApi.GetSqlConnectionString("SwDb"); // get connection str 
using (DataContext db = new DataContext(cstr)) 
{  
    Address addr = (from a in db.Address where a.Id == id select a).Single();  
    addr.AddressLine1 = colValue.Trim();  
    db.SubmitChanges(); // this seems to have no effect!!! 
} 

GetTable이 당신에게 무엇을 할 것인지 전혀 몰랐습니다.

또 다른 것은, 디버깅이 당신에게 실행 된 SQL을 표시합니다) SubmitChanges (이전

db.Log = Console.Out; 

추가하려고 Linq2SQL.

+0

db.GetTable

()은 db.Address와 같습니다. 후자는 db.GetTable <>을 호출하는 추가 속성 일뿐입니다. – liggett78

1

감사합니다. 의견을 보내 주시면 의견을 정리하는 데 도움이됩니다. 나는 "Id"컬럼을 PrimaryKey로 정의하지 않았으므로 분명하지는 않습니다. 나는 LinqToSQL이 업데이 트가 실패하면 오류가 발생했을 것으로 예상했을 것입니다. - S.

1

다음은 결과입니다. 내 데이터베이스 오브젝트를 작성하는 디자이너를 사용하지 않았기 때문에 내가 양식 db.Address를 사용할 수 없습니다, 대신이 같은 클래스로 정의 : 원래

[Table(Name = "Addresses")] 
public class Address 
{ 
    [Column(Name = "Id",IsPrimaryKey=true)] 
    public int Id { get; set; } 
    [Column(Name = "AddressLine1")] 
    public string AddressLine1 { get; set; } 
     ... 

, 나는이 없었다 " Id "열을 데이터베이스에 PK로 설정하지 않았으며 위의 [Column ...] 지정자에서 IsPrimaryKey = true를 사용하여 식별하지 않았습니다. 둘 다 필요합니다! 일단 변경을 수행하면 ChangeSet은 내가 원하는 업데이트를 발견했지만 그 전에는 0 행을 업데이트해야하고 변경 사항을 커밋하지 않아야한다고 말했습니다.

도움 주셔서 감사합니다. - S.

+0

그래서 대답은 정의 된 기본 키가 필요하다는 것이 었습니다. :) – Bryant

관련 문제