Tôi cần lấy danh sách các trường đã thay đổi, kho dữ liệu là ssce do đó không có trình kích hoạt nào có sẵnLàm thế nào để có được đồng bằng thay đổi thực thể trong EF?
Có hỗ trợ nào trong danh sách hoặc để xây dựng một thành phần chung không?
Tôi cần lấy danh sách các trường đã thay đổi, kho dữ liệu là ssce do đó không có trình kích hoạt nào có sẵnLàm thế nào để có được đồng bằng thay đổi thực thể trong EF?
Có hỗ trợ nào trong danh sách hoặc để xây dựng một thành phần chung không?
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);
}
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.
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
@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
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
xem câu trả lời mở rộng – vittore
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