2013-05-04 39 views
5

Tôi đã thực hiện việc này nhiều lần và nó đã hoạt động.Cập nhật bản ghi bằng cách sử dụng LINQ-to-SQL

Mỗi ví dụ tôi đã tìm thấy là chính xác những gì tôi có ..

tôi làm truy vấn của tôi ...

var result = from u in tdc.tblUsers 
      where u.UserID == userID 
      select u; 

và sau đó tôi thay đổi các giá trị tôi muốn:

foreach (tblUsers u in result) 
{ 
    //change values (and no im not changing the primary key or foreign keys) 
} 

sau đó tôi gửi các thay đổi

tdc.SubmitChanges(); 

Tôi có cũng đã cố gắng nó theo cách này trước và có những lỗi tương

tblUsers result = (from u in tdc.tblUsers 
        where u.UserID == userID 
        select u).Single(); 
result.Address = address; 
result.Phone = phone; 
tdc.SubmitChanges(); 

Nó sẽ chỉ bao giờ lấy 1 kỷ lục với truy vấn này kể từ UserID là khóa chính.

Khi lần truy cập gửi thay đổi, nó sẽ ném ngoại lệ cho hàng không được tìm thấy hoặc đã bị thay đổi. Tôi là người duy nhất sử dụng điều này nên không có xung đột nào khác khi truy cập vào db hoặc khóa. Tại sao nó sẽ ném ChangeConflictException? Tôi đã bước qua với trình gỡ lỗi và dữ liệu vẫn tồn tại trong suốt quá trình, bao gồm những thay đổi mà tôi đang cố gắng thực hiện.

+0

Bạn có đang sử dụng Khung thực thể (và nếu có, phiên bản nào)? – gunr2171

+0

Ngoài ra, hãy TẤT CẢ các bảng của bạn có các khóa chính. Điều này bao gồm một trong những bạn đang chỉnh sửa, và bất kỳ bảng phân nhánh từ các khóa nước ngoài. – gunr2171

+0

.NET Framework 4 và có tất cả các bảng có các khóa chính và khóa ngoài thích hợp. Truy vấn này chỉ được thực hiện sau 1 bảng và bảng đó không có bất kỳ khóa ngoại nào trong đó. Nó là một trong những bảng cơ sở của tôi. –

Trả lời

6

Bạn nhận được lỗi này có thể do một trong các trường của bạn có thứ gì đó khác trong trình thiết kế LINQ to SQL và trong cơ sở dữ liệu thực tế.

Hoặc bạn có thể xem qua số này article

Chúc may mắn!

+0

Tôi đã xóa dbml, nguồn dữ liệu được làm mới và kéo tất cả các bảng của tôi lại. Chương trình chạy lại và ngoại lệ không xảy ra. Cảm ơn bạn. Quên về một thay đổi tôi đã thực hiện cho cơ sở dữ liệu trước đó lol. +1 cho bạn –

+0

Tôi cũng vậy. Nó nói với tôi tôi đã phải chờ một vài phút lol –

2

Có thể bạn làm việc với ngữ cảnh khác nhau? Cố gắng đóng gói nó bằng cách sử dụng.

như thế này

using (myContext ctx = new myContext()) 
{ 
    var user = ctx.users.first(); 
    user.name="blah"; 
    ctx.SubmitChanges(); 
} 
0

Khá thường xuyên, nếu bạn nhìn vào SQL thực tế mà LINQ-to-SQL tạo ra, bạn sẽ thấy rằng nó đang được thực sự quá hăng say với phù hợp với dòng cơ sở dữ liệu mà bạn ban đầu được truy xuất. Hãy tưởng tượng rằng bạn có một bảng với các cột ID (PK), A, B, C. Bạn sẽ nghĩ rằng nếu bạn cập nhật cột C cho một hàng, nó sẽ là đủ để cập nhật hàng với một khóa chính phù hợp. Nhưng những gì thường xảy ra là Linq-to-SQL cũng đang cố gắng để phù hợp trên cột A và B là tốt. Bình thường, được rồi. Trừ khi bạn có đồng thời viết, hoặc từ đa luồng hoặc đa quy trình, và cái gì khác sửa đổi cột A hoặc B cho bản ghi mà bạn đang cố gắng để cập nhật. Sau đó, bạn nhận được những System.Data.Linq.ChangeConflictException: Hàng không tìm thấy hoặc thay đổi. lỗi khi bạn gọi SubmitChanges() trên ngữ cảnh dữ liệu của bạn.

Các vấn đề liên quan