2010-07-08 27 views
11

Làm thế nào tôi có thể cập nhật một thực thể mà không phải thực hiện cuộc gọi để chọn nó. Nếu tôi cung cấp khóa cho thực thể, nó sẽ không biết để cập nhật sau khi SaveChanges() được gọi trên ObjectContext.Thực thể cập nhật EF4 Không có thực thể bắt đầu

Tôi hiện làm điều này:

var user = context.Users.Single(u => u.Id == 2); 
user.Username = "user.name"; 
user.Name = "ABC 123"; 
context.SaveChanges(); 

đó làm việc, nhưng buộc một lựa chọn. Vì tôi biết số Id, tại sao tôi không thể làm điều gì đó như thế này:

var user = new User(); 
user.Id = 2; 
user.Username = "user.name"; 
user.Name = "ABC 123"; 
context.UpdateObject(user); 
context.SaveChanges(); 

Xin cảm ơn trước.

CHỈNH SỬA: Ngoài ra, điều quan trọng là chỉ thuộc tính bị ảnh hưởng được thay đổi mới được cập nhật. Điều này có thể không?

Trả lời

12

Có thể mã sau hoạt động tốt.

var user = new User(); 
user.Id = 2; 
context.Users.Attach(user); 

user.Username = "user.name"; 
user.Name = "ABC 123"; 

context.SaveChanges(); 
+0

Điều đó không thực sự * cập nhật * đối tượng trong cơ sở dữ liệu. Nó thêm nó vào danh sách người dùng mặc dù. – TheCloudlessSky

+0

Gọi 'context.ObjectStateManager.GetObjectStateEntry (người dùng) .ChangeState (EntityState.Modified);' thực hiện cập nhật ... – TheCloudlessSky

+1

Bạn có thay đổi thuộc tính Tên sau "context.Users.Attach (user);"? – user386740

-1

Bạn không phải chọn nó để có được dữ liệu cần chỉnh sửa? Nếu bạn lưu nó vào bộ nhớ cache, bạn sẽ không mất bất kỳ thứ gì khi nhận lại nó.

+9

Trong ứng dụng web điển hình bạn chọn, tạo trang chứa Id và "quên nó". Sau khi người dùng cập nhật thông tin và gửi biểu mẫu, bạn lấy lại Id và dữ liệu mới. Đây là thời điểm bạn muốn CHỈ cập nhật, thay vì tìm nạp dữ liệu bạn không cần thêm một lần nữa trước khi cập nhật. – Yakimych

+1

@Yakimych - Vâng, đó chính xác là tình huống mà tôi đang làm việc. Tôi không thực sự cần phải làm một chuyến đi đến db để chọn nó mặc dù tôi có dữ liệu. – TheCloudlessSky

4

Bạn có thể làm điều này theo một cách hơi nhân tạo, bằng cách thêm các thực thể và thay đổi EntityState để Modified:

var user = new User(); 
user.Id = 2; 
user.Username = "user.name"; 
user.Name = "ABC 123"; 

context.AddToUsers(user); 
ObjectStateEntry userEntry = context.ObjectStateManager.GetObjectStateEntry(user); 
userEntry.ChangeState(EntityState.Modified); 

context.SaveChanges(); 

Bằng cách này bạn sẽ được nói ObjectContext để tìm một mục với Id = 2 và cập nhật nó thay vì thêm một mục mới vào cơ sở dữ liệu.

+1

Ok thật tuyệt. Các công trình nhưng * một * vấn đề. Điều gì sẽ xảy ra nếu tôi chỉ muốn thay đổi thuộc tính 'Name'. Tôi không muốn tất cả các lĩnh vực gây ra một bản cập nhật. Đây có phải là một hạn chế với EF? – TheCloudlessSky

+0

nó hoạt động như một nét duyên dáng ... cảm ơn. – sikender

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