Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        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))));
        }