public async Task <int> Update <T>(T entity, CancellationToken token = default(CancellationToken)) where T : class, IDataModel
        {
            int result = default(int);

            using (var db = new MediaLibraryEntities())
            {
                db.Database.SetCommandTimeout(timeout);
                entity.ModifyDate      = DateTime.Now;
                db.Entry(entity).State = EntityState.Modified;
                result = await db.SaveChangesAsync(token);
            }

            return(result);
        }
        public async Task <int> Delete <T>(object id, CancellationToken token = default(CancellationToken)) where T : class, IDataModel
        {
            int result = default(int);

            using (var db = new MediaLibraryEntities())
            {
                DbSet <T> set    = null;
                T         entity = null;

                db.Database.SetCommandTimeout(timeout);
                set    = db.Set <T>();
                entity = await set.FindAsync(id);

                set.Remove(entity);
                result = await db.SaveChangesAsync(token);
            }

            return(result);
        }
        public async Task <int> Insert <T>(IEnumerable <T> entities, CancellationToken token = default(CancellationToken)) where T : class, IDataModel
        {
            int       result = default(int);
            IList <T> items  = entities.ToList();

            using (var db = new MediaLibraryEntities())
            {
                foreach (var item in items)
                {
                    item.CreateDate = DateTime.Now;
                    item.ModifyDate = DateTime.Now;
                }

                db.Database.SetCommandTimeout(timeout);
                db.Set <T>().AddRange(items);
                result = await db.SaveChangesAsync(token);
            }

            return(result);
        }
        public async Task <int> DeleteAll <T>(Expression <Func <T, bool> > expression = null, CancellationToken token = default(CancellationToken)) where T : class, IDataModel
        {
            int result = default(int);

            if (expression != null)
            {
                using (var db = new MediaLibraryEntities())
                {
                    DbSet <T> set = null;

                    db.Database.SetCommandTimeout(timeout);
                    set = db.Set <T>();
                    set.RemoveRange(set.Where(expression));
                    result = await db.SaveChangesAsync(token);
                }
            }
            else
            {
                result = await DeleteAll <T>(token : token);
            }

            return(result);
        }