EntityFramework - 如何获取ObjectSet <t> </t>

时间:2013-04-26 09:11:27

标签: entity-framework edmx

我正在使用asp.net mvc3。

我有一个创建了ADO.NET实体数据模型的edmx。 (数据前)

TestDb.Designer.cs

namespace Test.Web.DataModel
{
    public partial class TestDbContext : ObjectContext
    {
         public ObjectSet<T_Members> T_Members { ... }
         public ObjectSet<T_Documents> T_Documents { ... }
         ....
    }
}

如何按名称获取ObjectSet(字符串)?

例如,我想成为这样。

var members = context.GetTable("T_Members"); // var members = context.T_Members;

1 个答案:

答案 0 :(得分:2)

我对ObjectContext内部结构并不熟悉,因此可能会采用更“原生”的方式,

...但你需要的是一些reflection来取消你的财产 (注意:我没有任何db-first方便检查,所以你需要调整一些错字 - 应该可以工作)

public static object GetTableFromName(this TestDbContext db, string propertyName)
{
    PropertyInfo property = null;
    property = typeof(TestDbContext)
        .GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public);
    return property.GetValue(db, null);
}
public static object GetTableFromType(this TestDbContext db, string tableTypeName)
{
    // var tableType = typeof(TestDbContext).Assembly.GetType("YourNamespace.T_Members");
    var tableType = Type.GetType(tableTypeName);
    var genericType = typeof(ObjectSet<>).MakeGenericType(new[] { tableType });
    var property = typeof(TestDbContext)
        .GetProperties(BindingFlags.Instance | BindingFlags.Public)
        .Where(x => x.PropertyType == genericType).FirstOrDefault();
    return property.GetValue(db, null);
}

并像

一样使用它
var table = db.GetTableFromName("T_Members");
table = db.GetTableFromType("YourNamespace.T_Members);
// this gets you the `object` you'd still need to 'cast' or something