2011-08-31 6 views

答えて

24

あなたはそう、あなたがDbContextによって隠されたいくつかのより高度な機能へのアクセスを与える根本的なObjectContextにアクセスすることができ、あなたのDbContextIObjectContextAdapterにをキャストする必要があります。

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

また、エンティティの主キーを探しています。私はジェネリックスを私のリポジトリで使っているので、実行時までEntityを知らない。私がこれまでにこれを行うために見つけた唯一の方法は、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 
     } 



    } 
    } 
関連する問題