Example #1
0
 protected CatalogBaseDB(IFactory <TData, T> factory, string serverURL, string apiId)
 {
     _dataSource  = new DBSource <T, TKey>(serverURL, apiId);
     _factory     = factory;
     _data        = new Dictionary <TKey, T>();
     _dataPackage = new TData();
 }
Example #2
0
 /// <summary>
 /// Запрос для поиска единичной записи по имени.
 /// </summary>
 /// <typeparam name="TEntity">Тип данных</typeparam>
 /// <param name="dbSource">Источник данных</param>
 /// <param name="name">Имя</param>
 /// <returns>Запись</returns>
 private static IQueryable <TEntity> GetSingleRecordByNameQuery <TEntity>(IDBSource dbSource, string name) where TEntity : class, IDBTableName
 {
     return(((DbContext)dbSource).
            Set <TEntity>().
            AsNoTracking().
            Where(i => i.Name.Equals(name)));
 }
Example #3
0
 /// <summary>
 /// Запрос для поиска записи по ID.
 /// </summary>
 /// <typeparam name="TEntity">Тип данных</typeparam>
 /// <param name="dbSource">источник данных</param>
 /// <param name="id">Код записи</param>
 /// <returns></returns>
 private static IQueryable <TEntity> GetSingleRecordQuery <TEntity>(IDBSource dbSource, int id) where TEntity : class, IDBTableID
 {
     return(((DbContext)dbSource).
            Set <TEntity>().
            AsNoTracking().
            Where(i => i.ID.Equals(id)));
 }
Example #4
0
        /// <summary>
        /// Получить значение из потока и приатачить.
        /// </summary>
        /// <typeparam name="TEntity">Тип данных</typeparam>
        /// <param name="dbContext">Контекст БД</param>
        /// <param name="valueOInTask">Поток с данными</param>
        /// <returns>Приатаченное значение</returns>
        internal static async Task <TEntity> AttachFromTaskAsync <TEntity>(IDBSource dbContext, Task <TEntity> valueOInTask) where TEntity : class
        {
            var attachedValue = await valueOInTask;

            ((MKKContext)dbContext).Set <TEntity>().Attach(attachedValue);

            return(attachedValue);
        }
Example #5
0
        /// <summary>
        /// Обновить кэш.
        /// </summary>
        /// <param name="dbSource">БД</param>
        /// <param name="adLoginsIDB">Логин в БД</param>
        /// <param name="login">Логин пользователя</param>
        private void UpdateCacheFromDB(IDBSource dbSource, ADLoginsDB adLoginsIDB, string login)
        {
            _ADLogins.TryAdd(login, adLoginsIDB);

            _ADLogins[login].Name       = GetNameByLogin(login);
            _ADLogins[login].UpdateDate = DateTime.Now;

            dbSource.SaveChanges();
        }
Example #6
0
        /// <summary>
        /// Сохранить изменения в БД асинхронно, при возникновении исключения, сохранить ошибку.
        /// и параметры, вызвавшие исключение.
        /// </summary>
        /// <typeparam name="TLoggedClass">Логируемый класс</typeparam>
        /// <param name="context">Расширяемый класс (DBContext)</param>
        /// <param name="logShortMessage">Сообщение для логгера</param>
        /// <param name="cancellationToken">Токен отмены</param>
        /// <returns></returns>
        internal static async Task <int> SaveChangesAndLogErrorAsync <TLoggedClass>(this IDBSource context,
                                                                                    LogShortMessage logShortMessage, CancellationToken cancellationToken) where TLoggedClass : class
        {
            ILogger <TLoggedClass>       logger        = MKKContext.LoggerFactory.CreateLogger <TLoggedClass>();
            LoggedMessage <TLoggedClass> loggedMessage =
                new LoggedMessage <TLoggedClass>(logger, logShortMessage.Message, logShortMessage.Params);

            return(await context.SaveChangesAndLogErrorAsync(loggedMessage, cancellationToken));
        }
Example #7
0
        /// <summary>
        /// Сохранить изменения в БД асинхронно, при возникновении исключения, сохранить ошибку.
        /// и параметры, вызвавшие исключение.
        /// </summary>
        /// <typeparam name="TLoggedClass">Логируемый класс</typeparam>
        /// <param name="context">Расширяемый класс (DBContext)</param>
        /// <param name="cancellationToken">Токен отмены</param>
        /// <returns></returns>
        internal static async Task <int> SaveChangesAndLogErrorAsync <TLoggedClass>(this IDBSource context,
                                                                                    CancellationToken cancellationToken) where TLoggedClass : class
        {
            ILogger <TLoggedClass>       logger        = MKKContext.LoggerFactory.CreateLogger <TLoggedClass>();
            LoggedMessage <TLoggedClass> loggedMessage =
                new LoggedMessage <TLoggedClass>(logger, "Ошибка внесения изменений в БД.");

            return(await context.SaveChangesAndLogErrorAsync <TLoggedClass>(loggedMessage, cancellationToken));
        }
Example #8
0
        /// <summary>
        /// Приатачить значение, при возникновении исключения, залогировать и пробросить дальше.
        /// </summary>
        /// <typeparam name="TEntity">Тип данных</typeparam>
        /// <typeparam name="TLoggedClass">Класс логируемого объекта</typeparam>
        /// <param name="dbContext">Контекст БД</param>
        /// <param name="value">Поток с данными</param>
        /// <param name="loggedMessage">Описание места и состоянии объекта вызвавшего исключение</param>
        /// <returns>Приатаченное значение</returns>
        internal static TEntity AttachAndLogError <TEntity, TLoggedClass>(IDBSource dbContext, TEntity value,
                                                                          LoggedMessage <TLoggedClass> loggedMessage) where TEntity : class where TLoggedClass : class
        {
            try {
                ((MKKContext)dbContext).Set <TEntity>().Attach(value);
            }
            catch (Exception exception) {
                loggedMessage.LogMessage("Ошибка работы с аттаче объекта. Исключение: {ContextException}", exception);
                throw;
            }

            return(value);
        }
Example #9
0
        /// <summary>
        /// Запрос для выборки договора.
        /// </summary>
        /// <param name="dbSource">Источник данных</param>
        /// <param name="account1CCode">Код договора 1С</param>
        /// <param name="includes">Объекты для включения в выборку</param>
        /// <returns>Запрос</returns>
        internal static IQueryable <Account1C> AccountDBQuery(IDBSource dbSource, string account1CCode, params Expression <Func <Account1C, object> >[] includes)
        {
            IQueryable <Account1C> query = dbSource.Account1Cs.
                                           AsNoTracking().
                                           Where(i => i.Account1CCode.Equals(account1CCode));

            foreach (var include in includes)
            {
                query = query.Include(include);
            }

            return(query);
        }
Example #10
0
        /// <summary>
        /// Обновить значение эккаунта асинхронно.
        /// </summary>
        /// <typeparam name="TEntity">Обновляемый тип данных</typeparam>
        /// <param name="dbSource">Источник данных</param>
        /// <param name="account1C">Счет</param>
        /// <param name="value">Новое значение</param>
        /// <param name="cancellationToken">Токен отмены</param>
        private static async Task UpdateAccountAsync <TEntity>(IDBSource dbSource, Account1C account1C, TEntity value,
                                                               CancellationToken cancellationToken) where TEntity : class, IDBTableName, new()
        {
            AttachAndLogError <Account1C, EFService1C>((MKKContext)dbSource, account1C);

            TEntity valueDB =
                await FindRequiredDBRecordByNameAndLogErrorAsync <TEntity, EFService1C>(value.Name, cancellationToken);

            string fieldName = valueDB.GetType().Name.Substring(0, (valueDB.GetType().Name.Length - "DB".Length));

            dbSource.Entry(valueDB).State = EntityState.Unchanged;
            account1C.GetType().GetProperty(fieldName)?.SetValue(account1C, valueDB);
            dbSource.Entry(account1C).State = EntityState.Modified;
        }
Example #11
0
        /// <summary>
        /// Добавить в БД новую запись пользователя.
        /// </summary>
        /// <param name="dBSource">БД</param>
        /// <param name="login">Логин пользователя</param>
        private void AddDataToDB(IDBSource dBSource, string login)
        {
            ADLoginsDB adLoginsIDB = new ADLoginsDB()
            {
                Login      = login,
                Name       = GetNameByLogin(login),
                UpdateDate = DateTime.Now
            };

            dBSource.ADLoginsDBs.Add(adLoginsIDB);
            dBSource.SaveChanges();

            _ADLogins.TryAdd(login, adLoginsIDB);
        }
Example #12
0
        /// <summary>
        /// Приатачить значение, при возникновении исключения, залогировать и пробросить дальше.
        /// </summary>
        /// <typeparam name="TEntity">Тип данных</typeparam>
        /// <typeparam name="TLoggedClass">Класс логируемого объекта</typeparam>
        /// <param name="dbContext">Контекст БД</param>
        /// <param name="value">Поток с данными</param>
        /// <returns>Приатаченное значение</returns>
        internal static TEntity AttachAndLogError <TEntity, TLoggedClass>(IDBSource dbContext, TEntity value)
            where TEntity : class where TLoggedClass : class
        {
            try {
                ((MKKContext)dbContext).Set <TEntity>().Attach(value);
            }
            catch (Exception exception) {
                ILogger <TLoggedClass> logger = MKKContext.LoggerFactory.CreateLogger <TLoggedClass>();
                logger.LogError(
                    exception,
                    "Ошибка работы с БД при аттаче объекта./* Тип объекта {TEntity}, значение объекта {value}," +
                    " исключение: {ContextException}*/",
                    typeof(TEntity), value, exception.Message);
                throw;
            }

            return(value);
        }
Example #13
0
 /// <summary>
 /// Сохранить изменения в БД асинхронно, при возникновении исключения, сохранить ошибку.
 /// и параметры, вызвавшие исключение.
 /// </summary>
 /// <typeparam name="TLoggedClass">Логируемый класс</typeparam>
 /// <param name="context">Расширяемый класс (DBContext)</param>
 /// <param name="loggedMessage">Описание места и состоянии объекта вызвавшего исключение</param>
 /// <param name="cancellationToken">Токен отмены</param>
 /// <returns></returns>
 internal static async Task <int> SaveChangesAndLogErrorAsync <TLoggedClass>(this IDBSource context,
                                                                             LoggedMessage <TLoggedClass> loggedMessage, CancellationToken cancellationToken) where TLoggedClass : class
 {
     return(await ContextLogErrorAsync(async() => await context.SaveChangesAsync(cancellationToken), loggedMessage));
 }
Example #14
0
 /// <summary>
 /// Запрос для выборки клиента.
 /// </summary>
 /// <param name="dbSource">Источник данных</param>
 /// <param name="code1C">Код записи</param>
 /// <returns>Запрос</returns>
 private static IQueryable <ClientDB> ClientDBQuery(IDBSource dbSource, string code1C)
 {
     return(dbSource.Clients.
            AsNoTracking().
            Where(i => i.Code1C.Equals(code1C)));
 }
Example #15
0
 public Movie(IDBSource dbsource = null)
 {
     _dbSource = dbsource ?? new DBSource();
 }
Example #16
0
 public static void SetConnectionString(string connectionString)
 {
     DBSource = new DBSource() { ConnectionString = connectionString };
 }
Example #17
0
 public Song(IDBSource dbSource = null)
 {
     _dbSource = dbSource ?? new DBSource();
 }
Example #18
0
        /// <summary>
        /// Получить значение из потока и приатачить.
        /// </summary>
        /// <typeparam name="TEntity">Тип данных</typeparam>
        /// <typeparam name="TLoggedClass">Класс логируемого объекта</typeparam>
        /// <param name="dbContext">Контекст БД</param>
        /// <param name="valueOInTask">Поток с данными</param>
        /// <param name="loggedMessage">Описание места и состоянии объекта вызвавшего исключение</param>
        /// <returns>Приатаченное значение</returns>
        internal static async Task <TEntity> AttachFromTaskAndLogErrorAsync <TEntity, TLoggedClass>(IDBSource dbContext,
                                                                                                    Task <TEntity> valueOInTask, LoggedMessage <TLoggedClass> loggedMessage) where TEntity : class where TLoggedClass : class
        {
            TEntity attachedValue;

            try {
                attachedValue = await valueOInTask;
                ((MKKContext)dbContext).Set <TEntity>().Attach(attachedValue);
            }
            catch (Exception exception) {
                loggedMessage.LogMessage("Ошибка работы с БД. Исключение: {ContextException}", exception);
                throw;
            }

            return(attachedValue);
        }
Example #19
0
        /// <summary>
        /// Получить значение из потока и приатачить.
        /// </summary>
        /// <typeparam name="TEntity">Тип данных</typeparam>
        /// <typeparam name="TLoggedClass">Класс логируемого объекта</typeparam>
        /// <param name="dbContext">Контекст БД</param>
        /// <param name="valueOInTask">Поток с данными</param>
        /// <returns>Приатаченное значение</returns>
        internal static async Task <TEntity> AttachFromTaskAndLogErrorAsync <TEntity, TLoggedClass>(IDBSource dbContext,
                                                                                                    Task <TEntity> valueOInTask) where TEntity : class where TLoggedClass : class
        {
            TEntity attachedValue;

            try {
                attachedValue = await valueOInTask;
                ((MKKContext)dbContext).Set <TEntity>().Attach(attachedValue);
            }
            catch (Exception exception) {
                ILogger <TLoggedClass> logger = LoggerFactory.CreateLogger <TLoggedClass>();
                logger.LogError(
                    exception,
                    "Ошибка работы с БД при аттаче объекта./* Тип объекта {TEntity}, исключение: {ContextException}*/",
                    typeof(TEntity), exception.Message);
                throw;
            }

            return(attachedValue);
        }
Example #20
0
 public HomeController(IDBSource db) : base()
 {
     _db = db;
 }