2010-05-17 31 views
6

Điều này thật lạ ... cập nhật được thực hiện nhiều lần nhưng không thể nhận ra tại sao điều này lại khác. mặc dù tôi đang sử dụng .net 4.0 bây giờ - tuy nhiên tôi nghi ngờ một lỗi của nó trong việc thực hiện L2S của nó. Nó không phải như thế này là một ứng dụng tuyệt vời và tuyệt vời của nó. Mặc dù tôi khá chắc chắn mã này làm việc trong khi tôi đã sử dụng RC.Linq2Sql - cố gắng cập nhật nhưng câu lệnh Đặt trong sql trống

Tôi cũng đã quản lý để tạo lại lỗi này bằng cách tạo dự án từ đầu bằng cách sử dụng thông tin bên dưới.

sự cố ở đây là câu lệnh cập nhật được tạo bởi L2S không có trường nào trong câu lệnh được đặt. Tôi đã thử kiểm tra rằng pk được thiết lập (chỉ có lý do tại sao tôi sẽ nghĩ rằng lĩnh vực ervery sẽ được yêu cầu ở đâu) và cũng đọc aroudn các thuộc tính dbml khác. Tôi đã được sử dụng linq2Sql trong khoảng 1 năm và chưa bao giờ có một vấn đề .. tôi vẫn nghĩ rằng tôi chỉ có một fart não rất lớn.

Lưu ý: Tôi đã xóa các phương thức bằng và GetHashCode để xóa một số trường - sự cố vẫn tiếp diễn sau này. Tôi đã không dọn sạch SQL mặc dù.

Tôi có một lớp khách hàng từ dbml Tôi đã thêm một phương pháp gọi là cập nhật

public partial class Client : ICopyToMe<Client> 

Phương pháp CopyToMe được thừa hưởng từ một giao diện

public interface ICopyToMe<T> 
    { 
     void CopyToMe(T theObject); 
    } 

cũng lớp đã GetHashCode ghi đè

public override int GetHashCode() 
{ 
    int retVal = 13^ID^name.GetHashCode(); 
    return retVal; 
} 

và bằng

public override bool Equals(object obj) 
{ 
    bool retVal = false; 
    Client c = obj as Client; 
    if (c != null) 
     if (c.ID == this.ID && c._name == this._name) 
      retVal = true; 
    return retVal; 
} 

phương pháp cập nhật trong lớp phần

public void UpdateSingle() 
     {   
      L2SDataContext dc = new L2SDataContext(); 
      Client c = dc.Clients.Single<Client>(p => p.ID == this.ID); 
      c.CopyToMe(this); 
      c.updatedOn = DateTime.Now; 

      dc.SubmitChanges(); 
      dc.Dispose(); 
         } 

Phương pháp CopytoMe

public void CopyToMe(Client theObject) 
     { 
      ID = theObject.ID; 
      name = theObject.name;     
     } 

Im tham gia một khách hàng đã được lựa chọn, thay đổi tên của nó và sau đó gọi phương thức cập nhật này. Các sql tạo ra là như sau

exec sp_executesql N'UPDATE [dbo].[tblClient] 
SET 
WHERE ([ID] = @p0) AND ([name] = @p1) AND ([insertedOn] = @p2) AND ([insertedBy] = @p3) AND ([updatedOn] = @p4) AND ([updatedBy] = @p5) 
AND ([deletedOn] IS NULL) AND ([deletedBy] IS NULL) AND (NOT ([deleted] = 1))',N'@p0 int,@p1 varchar(8000),@p2 datetime,@p3 int,@p4 
datetime,@p5 int',@p0=103,@p1='UnitTestClient',@p2=''2010-05-17 11:33:22:520'',@p3=3,@p4=''2010-05-17 11:33:22:520'',@p5=3 

Tôi không có ý tưởng tại sao điều này không làm việc ... sử dụng loại

chọn đối tượng -> bộ lĩnh vực giá trị mới -> trình chọn đối tượng

mẫu nhiều lần và không gặp phải vấn đề này. cũng không có gì rõ ràng là sai với dbml - mặc dù đây có thể là một tuyên bố sai

bất kỳ ý tưởng nào?

Vấn đề này làm cho ngồi trông giống như tôi sẽ phải quay trở lại ADO.Net mà sẽ làm cho tôi buồn.

Trả lời

1

OK sau một số cuộc thảo luận với một số người dùng microsoft rất hữu ích tôi đã tìm thấy câu trả lời cho vấn đề này.

LINQ sử dụng mã băm để lập chỉ mục các bộ sưu tập của nó trong bảng băm. Điều này có nghĩa là chức năng mã băm chỉ hoạt động trên các trường xác định duy nhất đối tượng.

Trong trường hợp này, Hash chỉ có thể hoạt động trên cột ID. Vì vậy GetHashCode sẽ luôn trả về cùng một giá trị cho các bản ghi có cùng khóa chính ngay cả khi dữ liệu của chúng khác nhau.

Mặt khác, bằng tay khác có thể kiểm tra trên một số lượng lớn hơn các trường - nghĩa là thử nghiệm của nó cụ thể hơn so với các so sánh GetHashCode.

Nếu bạn thực hiện chức năng GetHashCode bao gồm nhiều trường hơn các khóa chính thì linq2sql sẽ mất dấu vết của đối tượng và do đó sẽ hoạt động rất lạ.

+0

Hoàn hảo! Tôi đã làm điều chính xác và tìm thấy câu trả lời ở đây! Cảm ơn! – Ergodyne

0

Nếu câu lệnh UPDATE chính xác đó được gửi đến cơ sở dữ liệu (không có bất kỳ đối số SET nào), thì bạn đã tìm thấy một lỗi trong LINQ to SQL. Hãy thử mã của bạn trong .NET 4.0 và nếu nó vẫn không thành công, hãy gửi lỗi đến trang kết nối Microsoft.

+0

+1. Tôi không phát hiện ra truy vấn không hợp lệ. Tôi đã không thực sự hiểu những gì OP đã yêu cầu. – Steven

+0

đây là .net 4.0 ... bỏ lỡ mà teeny weeny chi tiết không đáng kể .. tôi đã thực sự lấy mã này từ một dự án 3,5 mà tôi đã chuyển đổi ... tôi 99,99% chắc chắn mã này làm việc hoàn toàn tốt sau đó. –

+0

tuy nhiên tôi đã thêm ghi đè kể từ đó đó là lý do tại sao nó bị hỏng. –

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