2011-12-14 17 views

Trả lời

7

Tùy thuộc vào loại ngữ cảnh và thực thể được tạo mà bạn có thể thực hiện theo nhiều cách khác nhau. Trong trường hợp của các đối tượng kế thừa từ Entity hoặc POCO bạn có thể sử dụng ObjectStateManager trong trường hợp tổ chức tự theo dõi, bạn có thể sử dụng Tracker từ thực thể riêng của mình.

vui lòng cung cấp thêm chi tiết về cách làm thế nào bạn tạo ra bối cảnh và cách bạn thực hiện thay đổi

chỉnh sửa (2): bạn có thể truy vấn ObjectStateManager cho các mục đã thay đổi chỉ đơn giản như thế này:

var changed = ctx.ObjectStateManager.GetObjectStateEntries().Where(e=>e.State != EntityState.Unchanged); 

EDITED (1):

Ví dụ sau từ MSDN chứng minh làm thế nào để truy vấn cho những thay đổi:

int orderId = 43680; 

using (AdventureWorksEntities context = 
new AdventureWorksEntities()) 
{ 
var order = (from o in context.SalesOrderHeaders 
      where o.SalesOrderID == orderId 
      select o).First(); 

// Get ObjectStateEntry from EntityKey. 
ObjectStateEntry stateEntry = 
    context.ObjectStateManager 
    .GetObjectStateEntry(((IEntityWithKey)order).EntityKey); 

//Get the current value of SalesOrderHeader.PurchaseOrderNumber. 
CurrentValueRecord rec1 = stateEntry.CurrentValues; 
string oldPurchaseOrderNumber = 
    (string)rec1.GetValue(rec1.GetOrdinal("PurchaseOrderNumber")); 

//Change the value. 
order.PurchaseOrderNumber = "12345"; 
string newPurchaseOrderNumber = 
    (string)rec1.GetValue(rec1.GetOrdinal("PurchaseOrderNumber")); 

// Get the modified properties. 
IEnumerable<string> modifiedFields = stateEntry.GetModifiedProperties(); 
foreach (string s in modifiedFields) 
    Console.WriteLine("Modified field name: {0}\n Old Value: {1}\n New Value: {2}", 
     s, oldPurchaseOrderNumber, newPurchaseOrderNumber); 

// Get the Entity that is associated with this ObjectStateEntry. 
SalesOrderHeader associatedEnity = (SalesOrderHeader)stateEntry.Entity; 
Console.WriteLine("Associated Enity's ID: {0}", associatedEnity.SalesOrderID); 
} 
+0

tạo mô hình từ db bằng thuật sĩ, mã điển hình repo.entity.value = newvalue để thực hiện thay đổi – Kumar

+0

xem câu trả lời mở rộng – vittore

+0

thú vị, nó có quy mô thành nhiều hàng như là "bảng" bị ràng buộc vào lưới và người dùng thực hiện thay đổi cho một hàng nhưng tôi không biết cái nào trước đó !! hoặc làm tôi cần phải nhận & lưu trữ các ObjectStateEntry cho mỗi bản ghi trong danh sách (mà có thể dễ dàng có> 10000 mục) – Kumar

2

Thường thì thực hành tốt để thực hiện việc này bằng cách sử dụng cấu trúc cơ sở dữ liệu. Đây chỉ là một cách tiếp cận khác với cách bạn hiện có.

Bạn có thể tạo trường mới loại datetime trong bảng được gọi là ví dụ ModifiedOn và cập nhật nó mỗi khi bạn cập nhật hàng trong cơ sở dữ liệu.

Sau đó, khi bạn muốn các hàng thay đổi sau một thời gian cụ thể mà bạn chỉ cần sử dụng:

where ModifiedOn > dateTime 

Nó chỉ là một gợi ý về cách bạn có thể tiếp cận vấn đề từ một góc độ khác nhau.

+0

nói chung bạn thậm chí không cần phải tự cập nhật trường, có loại trường dành riêng cho dấu thời gian đó. cách tiếp cận này hoàn toàn có ý nghĩa nhưng nó chỉ cho phép bạn có được thời gian thay đổi. bạn vẫn cần phải tự thực hiện các thay đổi thực tế, những gì bạn có thể làm chỉ lưu giữ bản gốc cùng với bản ghi mới hoặc sử dụng các phương pháp phức tạp hơn như đăng nhập quering (trong SQL Server). Mặt khác EntityFramework đã giữ thông tin này trước khi thực hiện cập nhật cho DB, vì vậy việc sử dụng dữ liệu hiện có này là quyết định khá rõ ràng – vittore

+0

@vittore - True. Tôi hoàn toàn đồng ý với bạn. Tôi chỉ muốn chỉ ra rằng đối với vấn đề cụ thể này có những cách tiếp cận khác. – TheBoyan

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