/// <summary> /// Obtiene la clave primaria de un elemento TModel /// /// Nota: Este método solo funciona para Models cuya clave primaria sea una única columna /// </summary> /// <param name="model">Elemento sobre el que se obtendrá la clave primaria</param> /// <returns>Clave del elemento</returns> static internal T PrimaryKey <T>(this Controller controller, object model) { T id = default(T); if (model == null) { return(id); } Type t = model.GetType(); DbContext db = DbContext; var objectContext = ((IObjectContextAdapter)db).ObjectContext; MethodInfo m = objectContext.GetType().GetMethod("CreateObjectSet", new Type[] { }); MethodInfo generic = m.MakeGenericMethod(t); object set = generic.Invoke(objectContext, null); PropertyInfo entitySetPI = set.GetType().GetProperty("EntitySet"); System.Data.Entity.Core.Metadata.Edm.EntitySet entitySet = (System.Data.Entity.Core.Metadata.Edm.EntitySet)entitySetPI.GetValue(set, null); string[] keyProperties = entitySet.ElementType.KeyMembers.Select(k => k.Name).ToArray(); if (keyProperties.Count() == 0) { return(id); } id = NetLibrary.Reflection.Manager.GetPropertyValue <T>(model, keyProperties[0]); return(id); }
private EntityKey CreateEntityKey(System.Data.Entity.Core.Metadata.Edm.EntitySet entitySet, object[] keyValues) { if (keyValues == null || !keyValues.Any() || keyValues.Any(v => v == null)) { throw new ArgumentException("Parameter keyValues cannot be empty or contain nulls."); } var keyNames = entitySet.ElementType.KeyMembers.Select(m => m.Name).ToList(); if (keyNames.Count != keyValues.Length) { throw new ArgumentException("Invalid number of key values."); } return(new System.Data.Entity.Core.EntityKey(entitySet.EntityContainer.Name + "." + entitySet.Name, keyNames.Zip(keyValues, (name, value) => new KeyValuePair <string, object>(name, value)))); }