3

目的: エンティティ typeof(UserAccount) = "UserAccounts" の dbset 名を取得する必要があります。しかし、実行時にはループに共通の型が必要なため、「UserAccount」の例がわかりません。typeofの「名前」だけ?

いくつかのエンティティで DbContext を作成しました。私はしばらくの間グーグルで調べてきましたが、タイプ変換のために機能していないようです?

この説明の最後にあるメソッドGetDbSetNameを参照してください。

私はこの EF についてはかなり新しいので、以下で説明するように私の問題を解決してください ;-)

public class MyEntities : DbContext
{
    public DbSet<UserAccount> UserAccounts { get; set;}
    public DbSet<UserRole> UserRoles { get; set; }
    public DbSet<UserAccountRole> UserAccountRoles { get; set; }
}

出力を制御する Type のリストを定義します。

public static List<Type> ModelListSorted()
{
    List<Type> modelListSorted = new List<Type>();
    modelListSorted.Add(typeof(UserRole));
    modelListSorted.Add(typeof(UserAccountRole));
    modelListSorted.Add(typeof(UserAccount));
    return modelListSorted;
}

問題はタイプを使用して以下にあります-「UserAccount」を使用すると機能し、「UserAccounts」を取得します。しかし、一連のタイプのループにいるため、実行時に「UserAccount」がありません。私は e を与える Type リストしか持っていません

public static loopList()
{
    List<Type> modelListSorted = ModelListSorted();
    foreach (Type currentType in modelListSorted)
    {
         string s = DataHelper.GetDbSetName(currentType, db);
    } 
}

これが私に課題を与える方法です;-) コンパイルしないことを意味します。アセンブリがないと言っていますか?私はそれがかなり擬似的であることを知っていますが、これはスムーズに行うことができますか?

public static string GetDbSetName(Type parmType, MyEntities db)
{
    string dbsetname = (db as IObjectContextAdapter).ObjectContext.CreateObjectSet<parmType>().EntitySet.Name;
    return dbsetname;
}
4

1 に答える 1

3

CreateObjectSetここでの課題は、ジェネリックメソッドを呼び出すステップと、結果から を取得するステップの 2 つのリフレクション ステップが含まEntitySetれていることです。これを行う方法は次のとおりです。

まず、方法:

string GetObjectSetName(ObjectContext oc, MethodInfo createObjectSetMethodInfo,
                        Type objectSetType, Type entityType)
{
    var objectSet = createObjectSetMethodInfo.MakeGenericMethod(entityType)
                                             .Invoke(oc, null);
    var pi = objectSetType.MakeGenericType(entityType).GetProperty("EntitySet");
    var entitySet = pi.GetValue(objectSet) as EntitySet;
    return entitySet.Name;
}

ご覧のとおり、まずジェネリック メソッドを表すObjectSetを呼び出して を取得します。次に、ジェネリック型のプロパティの を見つけます。最後に、このプロパティの値と取得した の名前を取得します。MethodInfoCreateObjectSet<T>()PropertyInfoEntitySetObectSet<T>EntitySet

これを行うには、最初にMethodInfofor CreateObjectSet<>()(パラメーターのないもの) とObjectSet<>型を取得します。

var createObjectSetMethodInfo = 
    typeof(ObjectContext).GetMethods()
                         .Single(i => i.Name == "CreateObjectSet" 
                                   && !i.GetParameters().Any());

var objectSetType = Assembly.GetAssembly(typeof(ObjectContext))
                            .GetTypes()
                            .Single(t => t.Name == "ObjectSet`1");

GetObjectSetNameそれらのジェネリック パラメータでは、具体的なエンティティ タイプによって指定されます。これは、これらの「MakeGeneric...」メソッドによって行われます。

var oc = (dbContextInstance as IObjectContextAdapter).ObjectContext;
var entityType = typeof(UserRole);
var name = GetObjectSetName(oc, createObjectSetMethodInfo, objectSetType, entityType);

EF 6 では、これらはusingsである必要があります。

using System.Data.Entity.Core.Metadata.Edm
using System.Data.Entity.Core.Objects
using System.Data.Entity.Infrastructure
using System.Linq
using System.Reflection
于 2014-10-19T00:04:36.743 に答える