2010-07-21 31 views
9

Tôi muốn cập nhật trường duy nhất của thực thể khi tôi biết Id pháp nhân.LINQ to SQL: cách cập nhật trường duy nhất mà không lấy toàn bộ thực thể

Có thể trong LINQ to SQL mà không lấy thực thể đầy đủ (với tất cả các trường từ DataContext là phí trên không)? Có thể tạo và đính kèm thực thể vào DataContext và đánh dấu (các) trường chính xác để đồng bộ hóa trên DataContext.SubmitChanges (hoặc một cái gì đó tương tự) không?

Cảm ơn bạn trước!

Trả lời

8

Có bạn có thể:

Foo foo=new Foo { FooId=fooId }; // create obj and set keys 
context.Foos.Attach(foo); 
foo.Name="test"; 
context.SubmitChanges(); 

Trong dbml của bạn thiết UpdateCheck = "Không bao giờ" cho tất cả tài sản.

Điều này sẽ tạo ra một bản cập nhật duy nhất mà không cần chọn.

Một caveat: nếu bạn muốn để có thể thiết lập Tên null bạn sẽ phải khởi tạo đối tượng foo của bạn đến một giá trị khác nhau để LINQ có thể phát hiện sự thay đổi:

Foo foo=new Foo { FooId=fooId, Name="###" }; 
... 
foo.Name=null; 

Nếu bạn muốn kiểm tra dấu thời gian trong khi cập nhật, bạn cũng có thể thực hiện việc này:

Foo foo=new Foo { FooId=fooId, Modified=... }; 
// Modified needs to be set to UpdateCheck="Always" in the dbml 
+0

Âm thanh thú vị. Tôi sẽ thử một vài ngày! –

+1

Có, cách tiếp cận tương tự hoạt động trong EF. Mặc dù tôi phải tạo thuộc tính EntityKey cũng như giá trị cho thuộc tính khóa chính. –

1

Bạn luôn có thể tạo ra một câu lệnh T-SQL tiêu chuẩn và thực hiện điều đó chống lại lưu trữ dữ liệu của bạn:

YourDataContext 
    .ExecuteCommand("UPDATE dbo.YourTable SET ThatField = newValue WHERE ID = 777", null); 

Với LINQ-to-SQL chính nó, bạn không thể làm điều này - đó là cơ bản giả định là nó luôn hoạt động trên đối tượng, toàn bộ vật thể và không có gì khác ngoài vật thể.

Nếu bạn cần làm điều này một cách thường xuyên, một cách sẽ là bọc nó vào một tệp lưu trữ và thêm proc được lưu trữ đó vào ngữ cảnh dữ liệu của bạn như một phương thức bạn có thể gọi trên ngữ cảnh dữ liệu.

+0

OMG, thật đáng tiếc. Tình hình có thay đổi trong EF không? Bạn có cá nhân dựa vào các toán tử T-SQL nhúng hay Thủ tục lưu sẵn được nhúng trong Mô hình cho các trường hợp như vậy không? –

+0

Không - EF có cách tiếp cận tương tự - nhưng NHibernate hoặc bất kỳ người lập bản đồ OR nào khác. Chúng được thiết kế để tải, thao tác và lưu ** đối tượng ** nói chung. Tôi không nhận thức được bất kỳ ORM nào cho phép bạn truy xuất chỉ một hoặc hai trường, thay đổi và lưu chúng ... –

+0

trong EF chúng ta có thể tạo thực thể trong bộ nhớ, khởi tạo thuộc tính EntityKey + thuộc tính khóa chính, sau đó đính kèm, sau đó thay đổi các thuộc tính mà chúng tôi muốn cập nhật. SaveChanges hoạt động để cập nhật. –

1

Bạn có thể làm mới đối tượng. Ví dụ này sẽ thay đổi tên của người đó:

Person person = _entities.Persons.FirstOrDefault(p => p.Id == id); 
person.FirstName = "Bill"; 
_entities.Refresh(System.Data.Objects.RefreshMode.ClientWins, person); 
_entities.SaveChanges(); 
+1

Cảm ơn bạn, @Gnome. Nhưng có thể cập nhật trường mà không truy xuất thực thể không? –

+0

;-) Tôi vừa đọc lại bài đăng của bạn. Theo như tôi biết bạn sẽ cần thực thể. Nhưng giải pháp này tránh được rằng trường học cũ-sql. – gnome

+1

có, nó tránh SQL "trường học cũ" - nhưng nó sẽ cần phải lấy thực thể đầy đủ đầu tiên, và sẽ lưu lại thực thể đầy đủ một lần nữa. Các "trường học cũ" SQL có thể nhận được xung quanh đó rất dễ dàng ..... –

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