public async Task <ActionResult <RepositoryResponse <UpdateViewModel> > > DetailsAsync(string viewType, int themeId, string folderType, int?id) { if (id.HasValue) { Expression <Func <MixTemplate, bool> > predicate = model => model.Id == id; var portalResult = await base.GetSingleAsync <UpdateViewModel>($"{viewType}_{themeId}_{folderType}_{id}", predicate); return(Ok(JObject.FromObject(portalResult))); } else { var getTheme = await Lib.ViewModels.MixThemes.ReadViewModel.Repository.GetSingleModelAsync(t => t.Id == themeId); if (getTheme.IsSucceed) { var model = new MixTemplate() { Status = MixService.GetEnumConfig <MixContentStatus>(MixAppSettingKeywords.DefaultContentStatus), ThemeId = themeId, ThemeName = getTheme.Data.Name, Extension = MixService.GetConfig <string>("TemplateExtension"), FolderType = folderType }; RepositoryResponse <UpdateViewModel> result = await base.GetSingleAsync <UpdateViewModel>($"{viewType}_default", null, model); return(Ok(JObject.FromObject(result))); } else { return(new RepositoryResponse <Lib.ViewModels.MixTemplates.UpdateViewModel>()); } } }
public async Task <ActionResult <JObject> > Details(string viewType, int?id) { string msg = string.Empty; if (id.HasValue) { Expression <Func <MixUrlAlias, bool> > predicate = model => model.Id == id; var portalResult = await base.GetSingleAsync <UpdateViewModel>($"{viewType}_{id}", predicate); return(Ok(JObject.FromObject(portalResult))); } else { var model = new MixUrlAlias() { Status = MixService.GetEnumConfig <MixEnums.MixContentStatus>(MixAppSettingKeywords.DefaultContentStatus) , Priority = UpdateViewModel.Repository.Max(a => a.Priority).Data + 1 }; RepositoryResponse <UpdateViewModel> result = await base.GetSingleAsync <UpdateViewModel>($"{viewType}_default", null, model); return(Ok(JObject.FromObject(result))); } }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { string cnn = MixService.GetConnectionString(MixConstants.CONST_CMS_CONNECTION); if (!string.IsNullOrEmpty(cnn)) { var provider = MixService.GetEnumConfig <MixDatabaseProvider>(MixConstants.CONST_SETTING_DATABASE_PROVIDER); switch (provider) { case MixDatabaseProvider.MSSQL: optionsBuilder.UseSqlServer(cnn); break; case MixDatabaseProvider.MySQL: optionsBuilder.UseMySql(cnn, ServerVersion.AutoDetect(cnn)); break; case MixDatabaseProvider.SQLITE: optionsBuilder.UseSqlite(cnn); break; case MixDatabaseProvider.PostgreSQL: optionsBuilder.UseNpgsql(cnn); break; default: break; } } }
private static void InitializeRepoDb() { var provider = MixService.GetEnumConfig <MixDatabaseProvider>(MixConstants.CONST_SETTING_DATABASE_PROVIDER); switch (provider) { case MixDatabaseProvider.MSSQL: SqlServerBootstrap.Initialize(); break; case MixDatabaseProvider.MySQL: MySqlBootstrap.Initialize(); break; case MixDatabaseProvider.PostgreSQL: PostgreSqlBootstrap.Initialize(); break; case MixDatabaseProvider.SQLITE: SqLiteBootstrap.Initialize(); break; default: SqLiteBootstrap.Initialize(); break; } }
protected override void OnModelCreating(ModelBuilder modelBuilder) { var provider = MixService.GetEnumConfig <MixDatabaseProvider>(MixConstants.CONST_SETTING_DATABASE_PROVIDER); string ns = string.Empty; switch (provider) { case MixDatabaseProvider.MSSQL: ns = "Mix.Cms.Lib.Models.EntityConfigurations.MSSQL"; break; case MixDatabaseProvider.MySQL: ns = "Mix.Cms.Lib.Models.EntityConfigurations.MySQL"; break; case MixDatabaseProvider.SQLITE: ns = "Mix.Cms.Lib.Models.EntityConfigurations.SQLITE"; break; case MixDatabaseProvider.PostgreSQL: ns = "Mix.Cms.Lib.Models.EntityConfigurations.POSTGRESQL"; break; default: break; } modelBuilder.ApplyAllConfigurationsFromNamespace(this.GetType().Assembly, ns); OnModelCreatingPartial(modelBuilder); }
public async Task <ActionResult <JObject> > Details(string viewType, int?pageId, int?postId) { string msg = string.Empty; switch (viewType) { default: if (pageId.HasValue && postId.HasValue) { Expression <Func <MixPagePost, bool> > predicate = model => model.PageId == pageId && model.PostId == postId && model.Specificulture == _lang; var portalResult = await base.GetSingleAsync <ReadViewModel>($"{viewType}_{pageId}_{postId}", predicate); return(Ok(JObject.FromObject(portalResult))); } else { var model = new MixPagePost() { Specificulture = _lang, Status = MixService.GetEnumConfig <MixContentStatus>(MixAppSettingKeywords.DefaultContentStatus), Priority = ReadViewModel.Repository.Max(a => a.Priority).Data + 1 }; RepositoryResponse <ReadViewModel> result = await base.GetSingleAsync <ReadViewModel>($"{viewType}_default", null, model); return(Ok(JObject.FromObject(result))); } } }
public async Task <ActionResult <JObject> > Details(string viewType, int?id) { string msg = string.Empty; switch (viewType) { case "portal": if (id.HasValue) { Expression <Func <MixTheme, bool> > predicate = model => model.Id == id; var portalResult = await base.GetSingleAsync <UpdateViewModel>($"{viewType}_{id}", predicate); if (portalResult.IsSucceed) { portalResult.Data.IsActived = MixService.GetConfig <int>(MixAppSettingKeywords.ThemeId, _lang) == portalResult.Data.Id; } return(Ok(JObject.FromObject(portalResult))); } else { var model = new MixTheme() { Status = Enum.Parse <MixEnums.MixContentStatus>(MixService.GetConfig <string>(MixAppSettingKeywords.DefaultContentStatus)) , Priority = UpdateViewModel.Repository.Max(a => a.Priority).Data + 1 }; RepositoryResponse <UpdateViewModel> result = await base.GetSingleAsync <UpdateViewModel>($"{viewType}_default", null, model); return(Ok(JObject.FromObject(result))); } default: if (id.HasValue) { Expression <Func <MixTheme, bool> > predicate = model => model.Id == id; var result = await base.GetSingleAsync <ReadViewModel>($"{viewType}_{id}", predicate); if (result.IsSucceed) { result.Data.IsActived = MixService.GetConfig <int>(MixAppSettingKeywords.ThemeId, _lang) == result.Data.Id; } return(Ok(JObject.FromObject(result))); } else { var model = new MixTheme() { Status = MixService.GetEnumConfig <MixEnums.MixContentStatus>(MixAppSettingKeywords.DefaultContentStatus) , Priority = ReadViewModel.Repository.Max(a => a.Priority).Data + 1 }; RepositoryResponse <ReadViewModel> result = await base.GetSingleAsync <ReadViewModel>($"{viewType}_default", null, model); return(Ok(JObject.FromObject(result))); } } }
public async Task <ActionResult <JObject> > Details(string viewType, int?id) { string msg = string.Empty; switch (viewType) { case "portal": if (id.HasValue) { Expression <Func <MixModule, bool> > predicate = model => model.Id == id && model.Specificulture == _lang; var portalResult = await base.GetSingleAsync <UpdateViewModel>($"{viewType}_{id}", predicate); return(Ok(JObject.FromObject(portalResult))); } else { var model = new MixModule() { Specificulture = _lang, Status = MixService.GetEnumConfig <MixContentStatus>(MixAppSettingKeywords.DefaultContentStatus), Priority = UpdateViewModel.Repository.Max(a => a.Priority).Data + 1 }; RepositoryResponse <UpdateViewModel> result = await base.GetSingleAsync <UpdateViewModel>($"{viewType}_default", null, model); return(Ok(JObject.FromObject(result))); } default: if (id.HasValue) { var beResult = await ReadMvcViewModel.Repository.GetSingleModelAsync(model => model.Id == id && model.Specificulture == _lang).ConfigureAwait(false); if (beResult.IsSucceed) { beResult.Data.LoadData(); } return(Ok(JObject.FromObject(beResult))); } else { var model = new MixModule(); RepositoryResponse <ReadMvcViewModel> result = new RepositoryResponse <ReadMvcViewModel>() { IsSucceed = true, Data = new ReadMvcViewModel(model) { Specificulture = _lang, Status = MixContentStatus.Preview, } }; return(Ok(JObject.FromObject(result))); } } }
/*** Methods ***/ public IDbConnection CreateConnection() { var provider = MixService.GetEnumConfig <MixDatabaseProvider>(MixConstants.CONST_SETTING_DATABASE_PROVIDER); var connectionType = GetDbConnectionType(provider); var connection = Activator.CreateInstance(connectionType) as IDbConnection; string cnn = MixService.GetConnectionString(MixConstants.CONST_CMS_CONNECTION); connection.ConnectionString = cnn; return(connection); }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { //define the database to use //string cnn = "Data Source=mix-messenger.db"; //optionsBuilder.UseSqlite(cnn); ; // IConfiguration configuration = new ConfigurationBuilder() //.SetBasePath(System.IO.Directory.GetCurrentDirectory()) //.AddJsonFile(Common.Utility.Const.CONST_FILE_APPSETTING) //.Build(); // //optionsBuilder.UseSqlServer(cnn); // string cnn = configuration.GetConnectionString("MixMessengerConnection"); // if (string.IsNullOrEmpty(cnn)) // { // cnn = _cnn; // } // //define the database to use // if (!string.IsNullOrEmpty(cnn)) // { // optionsBuilder.UseSqlServer(cnn); // } string cnn = MixService.GetConnectionString(MixConstants.CONST_CMS_CONNECTION); if (!string.IsNullOrEmpty(cnn)) { var provider = MixService.GetEnumConfig <MixDatabaseProvider>(MixConstants.CONST_SETTING_DATABASE_PROVIDER); switch (provider) { case MixDatabaseProvider.MSSQL: optionsBuilder.UseSqlServer(cnn); break; case MixDatabaseProvider.MySQL: optionsBuilder.UseMySql(cnn, ServerVersion.AutoDetect(cnn)); break; case MixDatabaseProvider.SQLITE: optionsBuilder.UseSqlite(cnn); break; case MixDatabaseProvider.PostgreSQL: optionsBuilder.UseNpgsql(cnn); break; default: break; } } } }
public async Task <ActionResult <JObject> > Details(string viewType, string name, int?id) { string msg = string.Empty; switch (viewType) { case "portal": if (id.HasValue || !string.IsNullOrEmpty(name)) { Expression <Func <MixDatabase, bool> > predicate = model => (model.Id == id || model.Name == name); var portalResult = await base.GetSingleAsync <UpdateViewModel>($"{viewType}_{id}", predicate); return(Ok(JObject.FromObject(portalResult))); } else { var model = new MixDatabase() { Status = MixService.GetEnumConfig <MixContentStatus>(MixAppSettingKeywords.DefaultContentStatus) , Priority = UpdateViewModel.Repository.Max(a => a.Priority).Data + 1 }; RepositoryResponse <UpdateViewModel> result = await base.GetSingleAsync <UpdateViewModel>($"{viewType}_default", null, model); return(Ok(JObject.FromObject(result))); } default: if (id.HasValue || !string.IsNullOrEmpty(name)) { Expression <Func <MixDatabase, bool> > predicate = model => model.Id == id || model.Name == name; var result = await base.GetSingleAsync <ReadViewModel>($"{viewType}_{id}", predicate); return(Ok(JObject.FromObject(result))); } else { var model = new MixDatabase() { Status = MixService.GetEnumConfig <MixContentStatus>(MixAppSettingKeywords.DefaultContentStatus) , Priority = ReadViewModel.Repository.Max(a => a.Priority).Data + 1 }; RepositoryResponse <ReadViewModel> result = await base.GetSingleAsync <ReadViewModel>($"{viewType}_default", null, model); return(Ok(JObject.FromObject(result))); } } }
private static string GetColumnType(MixDataType dataType, int?maxLength = null) { var provider = MixService.GetEnumConfig <MixDatabaseProvider>(MixConstants.CONST_SETTING_DATABASE_PROVIDER); switch (dataType) { case MixDataType.DateTime: case MixDataType.Date: case MixDataType.Time: return(provider switch { MixDatabaseProvider.PostgreSQL => "timestamp without time zone", _ => "datetime" });
//Ref https://github.com/dotnet/efcore/issues/10169 public override void Dispose() { var provider = MixService.GetEnumConfig <MixDatabaseProvider>(MixConstants.CONST_SETTING_DATABASE_PROVIDER); switch (provider) { case MixDatabaseProvider.MSSQL: SqlConnection.ClearPool((SqlConnection)Database.GetDbConnection()); break; case MixDatabaseProvider.MySQL: MySqlConnection.ClearPool((MySqlConnection)Database.GetDbConnection()); break; } base.Dispose(); }
public override ActionResult <UpdateViewModel> Default() { using (MixCmsContext context = new MixCmsContext()) { var transaction = context.Database.BeginTransaction(); var model = new MixPost() { Specificulture = _lang, Status = MixService.GetEnumConfig <MixEnums.MixContentStatus>(MixConstants.ConfigurationKeyword.DefaultContentStatus), Type = Request.Query["type"].ToString(), Template = Request.Query["template"].ToString() }; var result = new UpdateViewModel(model, context, transaction); return(Ok(result)); } }
public virtual async Task <ActionResult <TModel> > Create([FromBody] TUpdate data) { ReflectionHelper.SetPropertyValue(data, new JProperty("CreatedBy", User.Claims.FirstOrDefault( c => c.Type == "Username")?.Value)); ReflectionHelper.SetPropertyValue(data, new JProperty("Specificulture", _lang)); ReflectionHelper.SetPropertyValue(data, new JProperty("Status", MixService.GetEnumConfig <MixContentStatus>(MixAppSettingKeywords.DefaultContentStatus))); var result = await SaveAsync(data, true); if (result.IsSucceed) { return(Ok(result.Data)); } else { return(BadRequest(result.Errors)); } }
public static async Task <RepositoryResponse <bool> > ImportData( string culture, Lib.ViewModels.MixAttributeSets.ReadViewModel attributeSet, IFormFile file) { var result = new RepositoryResponse <bool>() { IsSucceed = true }; UnitOfWorkHelper <MixCmsContext> .InitTransaction(null, null, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { List <ImportViewModel> data = LoadFileData(culture, attributeSet, file); var fields = MixAttributeFields.UpdateViewModel.Repository.GetModelListBy(f => f.AttributeSetId == attributeSet.Id, context, transaction).Data; foreach (var item in data) { if (result.IsSucceed) { var isCreateNew = string.IsNullOrEmpty(item.Id); item.Fields = fields; item.AttributeSetName = attributeSet.Name; item.Status = MixService.GetEnumConfig <MixContentStatus>(MixAppSettingKeywords.DefaultContentStatus); var saveResult = await item.SaveModelAsync(true, context, transaction); ViewModelHelper.HandleResult(saveResult, ref result); } } UnitOfWorkHelper <MixCmsContext> .HandleTransaction(result.IsSucceed, isRoot, transaction); return(result); } catch (Exception ex) { return(UnitOfWorkHelper <MixCmsContext> .HandleException <bool>(ex, isRoot, transaction)); } finally { if (isRoot) { //if current Context is Root UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction); } } }
public async Task <RepositoryResponse <UpdateViewModel> > Save([FromForm] string model, [FromForm] IFormFile file) { if (model != null) { var json = JObject.Parse(model); var data = json.ToObject <UpdateViewModel>(); data.Status = MixService.GetEnumConfig <MixContentStatus>(MixAppSettingKeywords.DefaultContentStatus); data.Specificulture = _lang; data.File = file; var result = await base.SaveAsync <UpdateViewModel>(data, true); return(result); } return(new RepositoryResponse <UpdateViewModel>() { Status = 501 }); }
public override ActionResult <UpdateViewModel> Default() { using (MixCmsContext context = new MixCmsContext()) { var transaction = context.Database.BeginTransaction(); string template = !string.IsNullOrEmpty(Request.Query["template"].ToString()) ? $"{Request.Query["template"]}.cshtml" : null; var model = new MixPost() { Specificulture = _lang, Status = MixService.GetEnumConfig <MixContentStatus>(MixAppSettingKeywords.DefaultContentStatus), Type = Request.Query["type"].ToString(), Template = template }; var result = new UpdateViewModel(model, context, transaction); return(Ok(result)); } }
protected override void OnModelCreating(ModelBuilder modelBuilder) { var provider = MixService.GetEnumConfig <MixDatabaseProvider>(MixConstants.CONST_SETTING_DATABASE_PROVIDER); switch (provider) { case MixDatabaseProvider.PostgreSQL: modelBuilder.ApplyPostgresIddentityConfigurations(); break; case MixDatabaseProvider.MSSQL: case MixDatabaseProvider.MySQL: case MixDatabaseProvider.SQLITE: default: modelBuilder.ApplyIddentityConfigurations(); break; } OnModelCreatingPartial(modelBuilder); }
public override void ExpandView(MixCmsContext _context = null, IDbContextTransaction _transaction = null) { if (string.IsNullOrEmpty(Id)) { Status = Status == default ? MixService.GetEnumConfig <MixContentStatus>(MixAppSettingKeywords.DefaultContentStatus) : Status; } // Related Datas DataNavs = MixDatabaseDataAssociations.UpdateViewModel.Repository.GetModelListBy( n => n.ParentId == Id && n.ParentType == MixDatabaseParentType.Set && n.Specificulture == Specificulture, _context, _transaction).Data; Values = MixDatabaseDataValues.UpdateViewModel .Repository.GetModelListBy(a => a.DataId == Id && a.Specificulture == Specificulture, _context, _transaction).Data.OrderBy(a => a.Priority).ToList(); Fields = MixDatabaseColumns.UpdateViewModel.Repository.GetModelListBy(f => (f.MixDatabaseId == MixDatabaseId || f.MixDatabaseName == MixDatabaseName), _context, _transaction).Data; foreach (var field in Fields.OrderBy(f => f.Priority)) { var val = Values.FirstOrDefault(v => v.MixDatabaseColumnId == field.Id); if (val == null) { val = new MixDatabaseDataValues.UpdateViewModel( new MixDatabaseDataValue() { MixDatabaseColumnId = field.Id } , _context, _transaction) { Field = field, MixDatabaseColumnName = field.Name, StringValue = field.DefaultValue, Priority = field.Priority }; Values.Add(val); } val.CreatedBy = CreatedBy; val.ModifiedBy = ModifiedBy; val.MixDatabaseName = MixDatabaseName; val.Priority = field.Priority; val.Field = field; val.DataType = val.Field.DataType; val.MixDatabaseColumnName = val.MixDatabaseColumnName ?? val.Field?.Name; } }
public async Task <RepositoryResponse <UpdateViewModel> > UploadMedia([FromForm] IFormFile file) { if (file != null) { var data = new UpdateViewModel() { Status = MixService.GetEnumConfig <MixContentStatus>(MixAppSettingKeywords.DefaultContentStatus), Specificulture = _lang, FileFolder = $"{MixService.GetTemplateUploadFolder(_lang)}", File = file }; var result = await base.SaveAsync <UpdateViewModel>(data, true); return(result); } return(new RepositoryResponse <UpdateViewModel>() { Status = 501 }); }
public async Task <ActionResult <UpdateViewModel> > Init(string mixDatabaseName) { var getAttrSet = await Lib.ViewModels.MixDatabases.ReadViewModel.Repository.GetSingleModelAsync(m => m.Name == mixDatabaseName); if (getAttrSet.IsSucceed) { FormViewModel result = new FormViewModel() { Specificulture = _lang, MixDatabaseId = getAttrSet.Data.Id, MixDatabaseName = getAttrSet.Data.Name, Status = MixService.GetEnumConfig <MixContentStatus>(MixAppSettingKeywords.DefaultContentStatus), }; result.ExpandView(); return(Ok(result)); } else { return(BadRequest(getAttrSet.Errors)); } }
public async Task <ActionResult <UpdateViewModel> > InitByIdAsync(int moduleId) { var getModule = await Lib.ViewModels.MixModules.ReadListItemViewModel.Repository.GetSingleModelAsync( m => m.Id == moduleId && m.Specificulture == _lang).ConfigureAwait(false); if (getModule.IsSucceed) { var ModuleData = new UpdateViewModel( new MixModuleData() { ModuleId = getModule.Data.Id, Specificulture = _lang, Fields = getModule.Data.Fields, Status = MixService.GetEnumConfig <MixContentStatus>(MixAppSettingKeywords.DefaultContentStatus), }); return(Ok(ModuleData)); } else { return(BadRequest()); } }
public async Task <RepositoryResponse <UpdateViewModel> > DetailsAsync(string viewType, int moduleId, string id = null) { if (string.IsNullOrEmpty(id)) { var getModule = await Lib.ViewModels.MixModules.ReadListItemViewModel.Repository.GetSingleModelAsync( m => m.Id == moduleId && m.Specificulture == _lang).ConfigureAwait(false); if (getModule.IsSucceed) { var model = new MixModuleData( ) { ModuleId = moduleId, Specificulture = _lang, Fields = getModule.Data.Fields, Status = MixService.GetEnumConfig <MixContentStatus>(MixAppSettingKeywords.DefaultContentStatus) }; RepositoryResponse <UpdateViewModel> result = await base.GetSingleAsync <UpdateViewModel>($"{viewType}_default", null, model); return(result); } else { return(new RepositoryResponse <UpdateViewModel>() { IsSucceed = false }); } } else { Expression <Func <MixModuleData, bool> > predicate = model => model.Id == id && model.Specificulture == _lang; var portalResult = await base.GetSingleAsync <UpdateViewModel>($"{viewType}_{id}", predicate); return(portalResult); } }
public void LoadData(int?postId = null, int?productId = null, int?pageId = null , int?pageSize = null, int?pageIndex = 0 , MixCmsContext _context = null, IDbContextTransaction _transaction = null) { UnitOfWorkHelper <MixCmsContext> .InitTransaction(_context, _transaction, out MixCmsContext context, out IDbContextTransaction transaction, out bool isRoot); try { string sortBy = Property <string>("sortBy") ?? MixService.GetAppSetting <string>(MixAppSettingKeywords.SortBy); Enum.TryParse(typeof(DisplayDirection), Property <string>("sortDirection"), out object direction); DisplayDirection sortDirection = direction != null ? (DisplayDirection)direction : MixService.GetEnumConfig <DisplayDirection>(MixAppSettingKeywords.SortBy);; pageSize = pageSize > 0 ? pageSize : PageSize; pageIndex = pageIndex > 0 ? pageIndex : 0; Expression <Func <MixModuleData, bool> > dataExp = null; Expression <Func <MixModulePost, bool> > postExp = null; switch (Type) { case MixModuleType.Content: case MixModuleType.Data: dataExp = m => m.ModuleId == Id && m.Specificulture == Specificulture; //postExp = n => n.ModuleId == Id && n.Specificulture == Specificulture; //productExp = m => m.ModuleId == Id && m.Specificulture == Specificulture; break; case MixModuleType.ListPost: postExp = n => n.ModuleId == Id && n.Specificulture == Specificulture; break; default: dataExp = m => m.ModuleId == Id && m.Specificulture == Specificulture; postExp = n => n.ModuleId == Id && n.Specificulture == Specificulture; break; } if (dataExp != null) { var getDataResult = MixModuleDatas.ReadViewModel.Repository .GetModelListBy( dataExp, sortBy, sortDirection, pageSize, pageIndex , _context: context, _transaction: transaction); if (getDataResult.IsSucceed) { //getDataResult.Data.JsonItems = new List<JObject>(); //getDataResult.Data.Items.ForEach(d => getDataResult.Data.JsonItems.Add(d.JItem)); Data = getDataResult.Data; } } if (postExp != null) { var getPosts = MixModulePosts.ReadViewModel.Repository .GetModelListBy(postExp , sortBy, sortDirection , pageSize, pageIndex , _context: context, _transaction: transaction); if (getPosts.IsSucceed) { Posts = getPosts.Data; } } } catch (Exception ex) { UnitOfWorkHelper <MixCmsContext> .HandleException <PaginationModel <ReadMvcViewModel> >(ex, isRoot, transaction); } finally { if (isRoot) { //if current Context is Root UnitOfWorkHelper <MixCmsContext> .CloseDbContext(ref context, ref transaction); } } }