isnotnull
isnotnull

Reputation: 61

EntityFramework - How to get ObjectSet<T>

I'm working with asp.net mvc3.

I have a edmx that was created ADO.NET Entity Data Model. (Data-First)

TestDb.Designer.cs

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

How to get an ObjectSet by name(string)?

For example, I want to be this.

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

Upvotes: 1

Views: 1528

Answers (1)

NSGaga
NSGaga

Reputation: 14312

I'm not that familiar with ObjectContext internals, so there might be a more 'native' way,

...but what you need is some reflection to get your properties out.
(note: I don't have any db-first handy to check, so you'd need to adjust if some typo - should work though)

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);
}

and use it like

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 

Upvotes: 2

Related Questions