コード例 #1
0
ファイル: BREntities.cs プロジェクト: jackjet870/IM-2
        /// <summary>
        /// Generic save|update
        /// </summary>
        /// <typeparam name="T">Tipo de entidad</typeparam>
        /// <param name="entitySave">objeto a guardar</param>
        /// <param name="enumMode">
        /// Add. Agrega
        /// Edit. Actualiza
        /// Delete. Elimina
        /// </param>
        /// <returns>0. No se guardó | 1. Se guardó | -1 Existe un registro con el mismo ID</returns>
        /// <history>
        /// [emoguel] created 25/04/2016
        /// </history>
        public async static Task <int> OperationEntity <T>(T entitySave, EnumMode enumMode) where T : class
        {
            int nRes = 0;

            nRes = await Task.Run(() =>
            {
                using (var dbContext = new IMEntities(ConnectionHelper.ConnectionString()))
                {
                    switch (enumMode)
                    {
                        #region Delete
                    case EnumMode.Delete:
                        {
                            dbContext.Entry(entitySave).State = EntityState.Deleted;
                            break;
                        }

                        #endregion
                        #region Edit
                    case EnumMode.Edit:
                        {
                            dbContext.Entry(entitySave).State = EntityState.Modified;
                            break;
                        }

                        #endregion
                        #region Add
                    case EnumMode.Add:
                        {
                            var objContext = ((IObjectContextAdapter)dbContext).ObjectContext;
                            var objSet     = objContext.CreateObjectSet <T>();
                            #region Buscar si tiene Llave identity
                            bool blIdentity = false;
                            foreach (EdmProperty edm in objSet.EntitySet.ElementType.KeyMembers)
                            {
                                var a = edm.MetadataProperties.Where(item => item.Name == "http://schemas.microsoft.com/ado/2009/02/edm/annotation:StoreGeneratedPattern").FirstOrDefault();
                                if (a != null)
                                {
                                    if (a.Value.ToString() == "Identity")
                                    {
                                        blIdentity = true;
                                        break;
                                    }
                                }
                            }
                            #endregion

                            if (blIdentity == true)//Si es campo autoincremental
                            {
                                dbContext.Entry(entitySave).State = EntityState.Added;
                            }
                            else
                            {
                                var keyNames  = objSet.EntitySet.ElementType.KeyMembers.Select(edmMember => edmMember.Name);
                                var keyValues = keyNames.Select(name => entitySave.GetType().GetProperty(name).GetValue(entitySave, null)).ToArray();
                                var exists    = dbContext.Set <T>().Find(keyValues);
                                if (exists != null)//Validamos si existe un registro con el mismo ID
                                {
                                    return(-1);
                                }
                                else//Agrega
                                {
                                    dbContext.Entry(entitySave).State = EntityState.Added;
                                }
                            }
                            break;
                        }
                        #endregion
                    }
                    return(dbContext.SaveChanges());
                }
            });

            return(nRes);
        }