Loading Entities Dynamically with Entity Framework
        Posted  
        
            by Ricardo Peres
        on ASP.net Weblogs
        
        See other posts from ASP.net Weblogs
        
            or by Ricardo Peres
        
        
        
        Published on Fri, 14 Dec 2012 15:24:37 GMT
        Indexed on 
            2012/12/14
            17:04 UTC
        
        
        Read the original article
        Hit count: 311
        
Sometimes we may be faced with the need to load entities dynamically, that is, knowing their Type and the value(s) for the property(ies) representing the primary key.
One way to achieve this is by using the following extension methods for ObjectContext (which can be obtained from a DbContext, of course):
1: public static class ObjectContextExtensions
   2: {
    3: public static Object Load(this ObjectContext ctx, Type type, params Object [] ids)
   4:     {
    5: Object p = null;
   6:  
       7:         EntityType ospaceType = ctx.MetadataWorkspace.GetItems<EntityType>(DataSpace.OSpace).SingleOrDefault(x => x.FullName == type.FullName);
       8:  
       9:         List<String> idProperties = ospaceType.KeyMembers.Select(k => k.Name).ToList();
      10:  
    11: List<EntityKeyMember> members = new List<EntityKeyMember>();
  12:  
      13:         EntitySetBase collection = ctx.MetadataWorkspace.GetEntityContainer(ctx.DefaultContainerName, DataSpace.CSpace).BaseEntitySets.Where(x => x.ElementType.FullName == type.FullName).Single();
      14:  
    15: for (Int32 i = 0; i < ids.Length; ++i)
  16:         {
    17: members.Add(new EntityKeyMember(idProperties[i], ids[i]));
  18:         }
      19:  
    20: EntityKey key = new EntityKey(String.Concat(ctx.DefaultContainerName, ".", collection.Name), members);
  21:  
    22: if (ctx.TryGetObjectByKey(key, out p) == true)
  23:         {
    24: return (p);
  25:         }
      26:  
    27: return (p);
  28:     }
      29:  
    30: public static T Load<T>(this ObjectContext ctx, params Object[] ids)
  31:     {
    32: return ((T)Load(ctx, typeof(T), ids));
  33:     }
      34: }
This will work with both single-property primary keys or with multiple, but you will have to supply each of the corresponding values in the appropriate order.
Hope you find this useful! ![]()
© ASP.net Weblogs or respective owner