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(); }
/// <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))); }
/// <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))); }
/// <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); }
/// <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(); }
/// <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)); }
/// <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)); }
/// <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); }
/// <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); }
/// <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; }
/// <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); }
/// <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); }
/// <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)); }
/// <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))); }
public Movie(IDBSource dbsource = null) { _dbSource = dbsource ?? new DBSource(); }
public static void SetConnectionString(string connectionString) { DBSource = new DBSource() { ConnectionString = connectionString }; }
public Song(IDBSource dbSource = null) { _dbSource = dbSource ?? new DBSource(); }
/// <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); }
/// <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); }
public HomeController(IDBSource db) : base() { _db = db; }