在EF 4.0中,如果我理解正確,實體中有兩種類型的值:當前值和原始值。
我們可以通過調用ApplyOriginalValues(TEntity)方法來設置原始值,但是如何獲取原始值?如何在Entity Framework中獲取實體的原始值?
18
A
回答
13
您可以訪問他們通過ObjectStateEntry
var originalValues = context
.ObjectStateManager.GetObjectStateEntry(myEntity).OriginalValues;
27
@Eranga答案是過時的EF 5.由於某些原因,EF 5並沒有得到使用的語句像這樣原來的值時,工作得很好:
var originalValues = context.Entry(myEntity).OriginalValues;
我的工作溶液使用AsNoTracking()
方法從DbSet
,如下面的例子:
var originalEntity = context.MyEntities.AsNoTracking().FirstOrDefault(me => me.MyEntityID == myEntity.MyEntityID);
6
這可以進一步改進,以執行以下操作:不需要
var originalEntity = context.MyEntities.AsNoTracking()
.FirstOrDefault(me => me.MyEntityID == myEntity.MyEntityID);
在以上,良好,響應該Where
。
0
我遇到了類似的問題,AsNoTracking不適合我的情況,所以我提出了一些對我來說足夠好的方法:首先「克隆」實體,然後進行更改。
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;
}
然後再比較克隆與改變。
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;
}
0
有幾個版本的實體框架在使用中。
我自己更喜歡代碼優先,並與API很容易爲
_context.Entry(Entity).Reload();
老API的對ObjectContext的刷新方法,它可以在某些使用情況幫助
ObjectContext.Refresh(RefreshMode.StoreWins, Entity);
Docs https://msdn.microsoft.com/en-us/library/bb896255(v=vs.110).aspx
0
本答案涉及實體框架6.在EF 6中有一個原始值和當前值https://msdn.microsoft.com/en-us/library/gg679512(v=vs.113).aspx在查找並未找到一個好的答案後,我想出了以下測試函數,並認爲我會將它發佈給其他需要執行相同。
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. 如何從ChangeTracker獲取原始實體
- 2. 從Entity Framework的SaveChanges函數獲取原始對象?
- 3. 如何從Wit.Ai獲取原始實體值?
- 4. 更新實體屬性時如何獲取原始值?
- 5. 如何在TreeView中獲取原始值?
- 6. 如何在客戶端獲取原始實體實例?
- 7. 刪除Entity Framework中的所有實體
- 8. 在Entity Framework中自定義實體實體化6
- 9. CakePHP 3:如何獲取原始實體數據和修改的實體數據?
- 10. 如何在Entity Framework中聲明選擇實體數據類型?
- 11. 如何使用Entity Framework獲取列的最大值?
- 12. 如何將2+表映射到.NET Entity Framework中的實體?
- 13. 如何克隆Entity Framework Core中的實體?
- 14. 如何獲得Entity Framework 6.1中所有實體關係的列表?
- 15. 如何使用原始實體獲取屬性?
- 16. 如何從DataRow獲取原始DataColumn值?
- 17. 如何在使用Entity Framework CTP 5「code only」時獲取LINQ查詢的原始SQL?
- 18. 如何在WinForms中獲取MDI Child的原始表單實例?
- 19. 獲取實體中值的最大值
- 20. 如何使用存儲過程獲取Entity Framework中的身份?
- 21. 如何在沒有Nuget的情況下獲取Entity Framework 4.2?
- 22. libclang獲取原始值
- 23. 在Entity Framework中創建要插入的實體對象6
- 24. 在.NET Entity Framework中的上下文之間移動實體3.5
- 25. 在Entity Framework中保存實體的通用方法
- 26. 如何限制Entity Framework允許的值?
- 27. DbPropertyEntry獲取原始值
- 28. 在Entity Framework中將多行組合到一個實體中4.1
- 29. 如何在使用defaultValue時在Entity框架中獲取插入實體的Id?
- 30. 如何在android中獲取原始文件或原始目錄?
originalValues是DbDataRecord類型。如何將其轉換爲實體類型? – JatSing
@孫它沒有實體類型。您需要將這些值轉換爲適當的類型。例如'var name =(string)originalValues [「Name」];' – Eranga