2014-11-23 20 views
0

例如,我有這樣的:查找具有表名和鍵值實體

private object GetEntityFromKey(ObjectStateEntry entry) 
    { 
     object entity = null; 

     var key = entry.EntityKey; 
     var keyValues = entry.EntityKey.EntityKeyValues; 

     return entity; 
    } 

我的問題是我怎麼能檢索使用兩個已知因素的實體:keykeyValues

我需要這是動態的,所以返回的類型是object

我可以用得到的實體:

this.GetObjectByKey(key) 

但是這將從ObjectStateManager而不是數據源返回實體

我使用數據庫第一種方法。我這樣做的原因是因爲我需要比較新舊記錄的審計目的。

+1

您使用的代碼先? – Derek 2014-11-23 15:27:46

+0

@Derek德里克嗨,我使用的數據庫第一種方法 – NeedAnswers 2014-11-23 15:29:30

+0

@Derek我還編輯我的問題,請大家看看 – NeedAnswers 2014-11-23 15:33:35

回答

1

如果您在EF訴4.2或更高版本的時候,你可以從現有的ObjectContext實例DbContext。一旦你得到了這個DbContext您可以使用它的方法Find通過鍵搞定的對象。

All in one的方法包裹起來,並省略null檢查,我想這可能爲你工作:

public static class ObjectContextExtensions 
{ 
    public static T GetOriginalEntity<T>(this ObjectContext oc, T localEntity) 
     where T : class 
    { 
     ObjectStateEntry ose; 
     oc.ObjectStateManager.TryGetObjectStateEntry(localEntity, out ose); 
     var keys = ose.EntityKey.EntityKeyValues.Select(k => k.Value).ToArray(); 
     using (var db = new DbContext(oc, false)) 
     { 
      return db.Set<T>().Find(keys); 
     } 
    } 

} 

用法:

Entity entity; 

using(var objContext = new MyObjectContext()) 
{ 
    entity = objContext.Entities.Single(e => e.Id == someId); 

    ... 
} 

using(var objContext = new MyObjectContext()) 
{ 
    var entityOrg = objContext.GetOriginalEntity(entity); 
} 

你必須GetOriginalEntity使用新的背景下,因爲Find方法首先嚐試從上下文的緩存的實體。

+0

你好,謝謝,但我使用EF 4.1。希望這可以幫助別人! – NeedAnswers 2014-11-24 06:04:42

相關問題