このような方法はありますか?コード内の任意のエンティティの主キー値を最初に取得します
object GetPrimaryKeyValue(DbEntityEntry entry);
またはどのように実装する必要がありますか?
このような方法はありますか?コード内の任意のエンティティの主キー値を最初に取得します
object GetPrimaryKeyValue(DbEntityEntry entry);
またはどのように実装する必要がありますか?
あなたはそう、あなたがDbContext
によって隠されたいくつかのより高度な機能へのアクセスを与える根本的なObjectContext
にアクセスすることができ、あなたのDbContext
IObjectContextAdapter
にをキャストする必要があります。
DbContext
を派生するクラス内では、次のメソッドが機能します。
object GetPrimaryKeyValue(DbEntityEntry entry)
{
var objectStateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity);
return objectStateEntry.EntityKey.EntityKeyValues[0].Value;
}
複数のキーがある場合は、EntityKeyValues
プロパティを反復処理する必要があります。
また、エンティティの主キーを探しています。私はジェネリックスを私のリポジトリで使っているので、実行時まで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);
これは完全なクラスですが、私が使用している解決方法を示してくれることを願っています。
添付する必要はありません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
}
}
}
実体は 'ObjectStateManager'に存在する場合にのみ動作すること。分離されたエントリのエンティティキーを取得する方法はありますか? – Shimmy
同じ問題があります。私はObjectStateManagerを参照するたびにこのエラーが発生します。 ObjectStateManagerに 'NAME_OF_ENTITY'タイプのオブジェクトへの参照を含むObjectStateEntryが含まれていません – Hemslingo
@Shimmy、私の答えを参照してください – toddmo