Trong EF 4.0, nếu tôi hiểu đúng, có hai loại giá trị trong Thực thể: giá trị hiện tại và giá trị ban đầu.
Chúng tôi có thể đặt giá trị ban đầu bằng cách gọi phương thức ApplyOriginalValues (TEntity) nhưng cách lấy giá trị gốc?Cách lấy các giá trị ban đầu của một thực thể trong Khung thực thể?
Trả lời
Bạn có thể truy cập chúng thông qua ObjectStateEntry
var originalValues = context
.ObjectStateManager.GetObjectStateEntry(myEntity).OriginalValues;
@Eranga câu trả lời là lỗi thời cho EF 5. Đối với một số lý do, EF 5 không hoạt động tốt khi nhận được giá trị ban đầu bằng một tuyên bố như thế này:
var originalValues = context.Entry(myEntity).OriginalValues;
giải pháp làm việc của tôi sử dụng phương pháp AsNoTracking()
từ DbSet
, như ví dụ dưới đây:
var originalEntity = context.MyEntities.AsNoTracking().FirstOrDefault(me => me.MyEntityID == myEntity.MyEntityID);
AsNoTracking() hiệu suất tốt hơn - google it – Moji
Làm cách nào để nhận được giá trị được sửa đổi? –
@AwaisMahmood Tôi nghĩ điều này xứng đáng với một câu hỏi riêng. –
Điều này có thể được tinh chế thêm những điều sau đây:
var originalEntity = context.MyEntities.AsNoTracking()
.FirstOrDefault(me => me.MyEntityID == myEntity.MyEntityID);
Các Where
ở trên, tốt, phản ứng không cần thiết.
Tôi gặp phải vấn đề tương tự và AsNoTracking không phải là một lựa chọn cho tình huống của tôi vì vậy tôi đã đưa ra một cái gì đó hoạt động tốt cho tôi: đầu tiên "nhân bản" thực thể rồi thực hiện thay đổi.
public T Clone<T>(T entity)
where T : class, new() {
var clone = new T();
var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy)
.Where(a => a.CanRead &&
a.CanWrite &&
a.GetMethod.IsFinal);
foreach (var property in properties) {
property.SetValue(clone, property.GetValue(entity));
}
return clone;
}
và sau đó so sánh bản sao với thay đổi.
public string GenerateChangeText<T>(T original, T current)
where T : class, new() {
var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy)
.Where(a => a.CanRead &&
a.CanWrite &&
a.GetMethod.IsFinal);
var changes = string.Empty;
foreach (var property in properties) {
var originalValue = property.GetValue(original);
var currentValue = property.GetValue(current);
if (originalValue == null && currentValue == null) continue;
if ((originalValue != null && !originalValue.Equals(currentValue)) ||
(currentValue != null && !currentValue.Equals(originalValue))) {
changes += $" changed {property} from {original ?? "NULL"} to {current ?? "NULL"}.";
}
}
return changes;
}
Có một vài phiên bản Khuôn khổ thực thể được sử dụng.
Bản thân tôi thích Mã đầu tiên và với API rằng đó là dễ dàng như
_context.Entry(Entity).Reload();
của API cũ có một phương pháp Refresh trên ObjectContext mà có thể giúp đỡ trong trường hợp sử dụng nhất định
ObjectContext.Refresh(RefreshMode.StoreWins, Entity);
Tài liệu https://msdn.microsoft.com/en-us/library/bb896255(v=vs.110).aspx
Câu trả lời này đề cập đến khung thực thể 6. Trong EF 6 có giá trị gốc và giá trị hiện tại https://msdn.microsoft.com/en-us/library/gg679512(v=vs.113).aspx Sau khi tìm kiếm và không tìm được câu trả lời hay, tôi đã đưa ra chức năng kiểm tra sau đây và nghĩ rằng tôi sẽ đăng nó cho những người khác cần làm tương tự.
private void test()
{
// table has a field Description of type varchar(200)
WDMDBEntities context = new WDMDBEntities();
var query = context.Brands;
List<Brand> records = query.ToList();
if (records.Count > 0)
{
Brand currentRecord = records[0];
currentRecord.Description = "some new text";
string originalValue = null;
switch (context.Entry(currentRecord).State)
{
case System.Data.Entity.EntityState.Added:
originalValue = null;
break;
case System.Data.Entity.EntityState.Deleted:
case System.Data.Entity.EntityState.Detached:
case System.Data.Entity.EntityState.Modified:
case System.Data.Entity.EntityState.Unchanged:
originalValue = context.Entry(currentRecord).Property(u => u.Description).OriginalValue;
break;
}
}
context.Dispose();
}
- 1. Giá trị rỗng của khung thực thể trong truy vấn
- 2. Cách lấy giá trị tối đa của cột bằng cách sử dụng Khung thực thể?
- 3. Lấy kịch bản lệnh chuyển đổi khung thực thể ban đầu
- 4. Giá trị ban đầu của một Enum
- 5. Xác thực khung thực thể
- 6. Cột khung thời gian thực thể - Giá trị GetDate() Chèn
- 7. Tạo khung thực thể thiếu một thực thể
- 8. Cách lấy giá trị ban đầu của các trường đã thay đổi?
- 9. Mã khung thực thể Mã giá trị mặc định CTP4 đầu tiên?
- 10. Nhận giá trị khóa chính của một thực thể tùy ý trong mã đầu tiên
- 11. xlrd giá trị ban đầu của ô
- 12. Tạo một bộ từ Bảng có giá trị trong khung thực thể
- 13. Trao đổi các giá trị với ràng buộc duy nhất trong Khung thực thể
- 14. FunctionImport trong khung thực thể 4 issue
- 15. Cách lấy sql được tạo bởi khung thực thể
- 16. Các bảng được bản địa hóa và Khung thực thể
- 17. Làm cách nào tôi có thể đặt giá trị ban đầu của dijit.form.DateTextBox thành hôm nay?
- 18. GROUP và SUM trong khung thực thể
- 19. Bản đồ không thể SYS_REFCURSOR trong khung thực thể
- 20. Cách tạo giá trị ban đầu trong modelform
- 21. Khung thực thể - Chỉ cập nhật các giá trị không rỗng
- 22. Trình tạo tăng trưởng của NHibernate - không thể tìm nạp giá trị ban đầu
- 23. Mã hóa ConnectionString trong khung thực thể (mã đầu tiên)
- 24. Xóa một mục có khung thực thể
- 25. Lấy id của thực thể được chèn vào trong datomic?
- 26. JQuery: Nhận giá trị nhập ban đầu
- 27. Cách tốt nhất để so sánh hai thực thể khung thực thể là gì?
- 28. Cách lấy một trường cụ thể từ một thực thể bằng cách sử dụng khung Morphia và Play trong Java
- 29. Cách lấy (các) Khoá chính trong Khung thực thể 4.1, tức là sử dụng DbContext
- 30. Hiệu suất của khung thực thể 4 so với khung thực thể 3.5 như thế nào?
originalValues là DbDataRecord type. Làm thế nào để chuyển đổi nó thành loại thực thể? – JatSing
@Sun nó không có loại thực thể. Bạn cần truyền các giá trị cho loại thích hợp. ví dụ 'var name = (string) originalValues [" Name "];' – Eranga