2011-08-31 48 views

回答

24

您需要將您的DbContext轉換爲IObjectContextAdapter,以便您可以訪問底層ObjectContext,從而使您可以訪問由DbContext隱藏的一些更高級功能。

在你的班級裏面派生DbContext下面的方法會起作用。

object GetPrimaryKeyValue(DbEntityEntry entry) 
{ 
    var objectStateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity); 
    return objectStateEntry.EntityKey.EntityKeyValues[0].Value; 
} 

如果有一個以上的密鑰,那麼你應該遍歷EntityKeyValues財產。

+4

,只有當在'ObjectStateManager'存在的實體運作。有沒有辦法獲得分離條目的實體鍵? – Shimmy

+1

我有同樣的問題。每當我引用ObjectStateManager時,我都會得到這個錯誤。 ObjectStateManager不包含引用'NAME_OF_ENTITY'類型對象的ObjectStateEntry, – Hemslingo

+0

@Shimmy,請參閱我的回答 – toddmo

0

我也在尋找一個實體的主鍵。我在我的存儲庫中使用泛型,因此直到運行時才知道實體。我發現迄今爲止做到這一點的唯一方法是使用sql語句。

public abstract class GenericRepository<T> : ApiController,IGenericRepository<T> where T : class 
{ 


    string sqlstr = @" 
     SELECT COLUMN_NAME 
     FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
     WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + CONSTRAINT_NAME), 'IsPrimaryKey') = 1 
     AND TABLE_NAME = '" + typeof(T).ToString() + "' AND TABLE_SCHEMA = 'dbo'"; 

    private Entities _entities = new Entities(); 


    public virtual IQueryable<T> GetAll() 
    { 
     DbSqlQuery<T> queryTest = _entities.Set<T>().SqlQuery(sqlstr); 

這只是一個完整的類的祈禱,但希望顯示我正在使用的解決方案。

0

您不需要附上T item。這可能是漫長的,但它的工作原理。例如,

public object[] GetPrimaryKeyValues<T>(DbContext databaseContext, T item) 
{ 
    return ((IObjectContextAdapter)databaseContext).ObjectContext.CreateEntityKey(typeof(T).Name.Pluralize(), item).EntityKeyValues.Select(kv => kv.Value).ToArray(); 
} 

返回類型適用於Find。看,鍵值實際上是一個對象數組。

如果你需要以複數(),那就是:

using System; 
using System.Data.Entity.Design.PluralizationServices; 
using System.Linq; 
using System.Reflection; 

namespace Atlas.Core.Kernel.Extensions 
{ 
    public static class Strings 
    { 
     private static PluralizationService pluralizationService = PluralizationService.CreateService(System.Globalization.CultureInfo.CurrentUICulture); 
     public static string Pluralize(this MemberInfo memberInfo)//types, propertyinfos, ect 
     { 
     return Pluralize(memberInfo.Name.StripEnd()); 
     } 

     public static string Pluralize(this string name) 
     { 
     return pluralizationService.Pluralize(name); // remove EF type suffix, if any 
     } 



    } 
    } 
相關問題