Refactor catalog CRUD to use stored procedures only

Removed direct usage of TbmyCatalog entity and DbSet. All create, update, and delete operations now use stored procedures. Entity lookups and mappings are performed via the VwmyCatalog view. Updated AutoMapper profile and DbContext configuration accordingly. Catalog creation now sets ChangedWho/ChangedWhen to "system" and current UTC time.
This commit is contained in:
OlgunR
2026-01-14 12:50:58 +01:00
parent 6f3c0e33fa
commit ccd97fe9d6
5 changed files with 51 additions and 108 deletions

View File

@@ -33,24 +33,26 @@ public class CatalogRepository : ICatalogRepository
public async Task<Catalog> AddAsync(Catalog catalog, CancellationToken cancellationToken = default)
{
var entity = _mapper.Map<TbmyCatalog>(catalog);
_db.TbmyCatalogs.Add(entity);
await _db.SaveChangesAsync(cancellationToken);
return _mapper.Map<Catalog>(entity);
var created = await UpsertWithStoredProcedureAsync(catalog, cancellationToken);
if (created == null)
{
throw new InvalidOperationException("Failed to create catalog via stored procedure.");
}
return created;
}
public async Task<bool> UpdateAsync(int id, Catalog catalog, CancellationToken cancellationToken = default)
{
var entity = await _db.TbmyCatalogs.FirstOrDefaultAsync(x => x.Guid == id, cancellationToken);
if (entity == null)
var existing = await _db.VwmyCatalogs.AsNoTracking().AnyAsync(x => x.Guid == id, cancellationToken);
if (!existing)
{
return false;
}
_mapper.Map(catalog, entity);
entity.Guid = id;
await _db.SaveChangesAsync(cancellationToken);
return true;
catalog.Guid = id;
var updated = await UpsertWithStoredProcedureAsync(catalog, cancellationToken);
return updated != null;
}
public async Task<Catalog?> UpdateWithStoredProcedureAsync(Catalog catalog, CancellationToken cancellationToken = default)
@@ -60,48 +62,18 @@ public class CatalogRepository : ICatalogRepository
return null;
}
var existing = await _db.TbmyCatalogs.AsNoTracking().FirstOrDefaultAsync(x => x.Guid == catalog.Guid, cancellationToken);
if (existing == null)
var existing = await _db.VwmyCatalogs.AsNoTracking().AnyAsync(x => x.Guid == catalog.Guid, cancellationToken);
if (!existing)
{
return null;
}
var catTitleParam = new SqlParameter("@CAT_TITLE", existing.CatTitle);
var catStringParam = new SqlParameter("@CAT_STRING", catalog.CatString);
var changedWhoParam = new SqlParameter("@CHANGED_WHO", (object?)catalog.ChangedWho ?? DBNull.Value);
var guidOutParam = new SqlParameter("@GUID", SqlDbType.Int) { Direction = ParameterDirection.Output };
await _db.Database.ExecuteSqlRawAsync(
"EXEC dbo.PRTBMY_CATALOG_UPDATE @CAT_TITLE, @CAT_STRING, @CHANGED_WHO, @GUID OUTPUT",
parameters: new[] { catTitleParam, catStringParam, changedWhoParam, guidOutParam },
cancellationToken: cancellationToken);
if (guidOutParam.Value == DBNull.Value)
{
return null;
}
var guid = (int)guidOutParam.Value;
var entity = await _db.TbmyCatalogs.AsNoTracking().FirstOrDefaultAsync(x => x.Guid == guid, cancellationToken);
return entity == null ? new Catalog { Guid = guid, CatTitle = existing.CatTitle, CatString = catalog.CatString, ChangedWho = catalog.ChangedWho } : _mapper.Map<Catalog>(entity);
return await UpsertWithStoredProcedureAsync(catalog, cancellationToken);
}
public async Task<bool> DeleteAsync(int id, CancellationToken cancellationToken = default)
{
var entity = await _db.TbmyCatalogs.FirstOrDefaultAsync(x => x.Guid == id, cancellationToken);
if (entity == null)
{
return false;
}
_db.TbmyCatalogs.Remove(entity);
await _db.SaveChangesAsync(cancellationToken);
return true;
}
public async Task<bool> DeleteWithStoredProcedureAsync(int id, CancellationToken cancellationToken = default)
{
var exists = await _db.TbmyCatalogs.AsNoTracking().AnyAsync(x => x.Guid == id, cancellationToken);
var exists = await _db.VwmyCatalogs.AsNoTracking().AnyAsync(x => x.Guid == id, cancellationToken);
if (!exists)
{
return false;
@@ -115,4 +87,36 @@ public class CatalogRepository : ICatalogRepository
return true;
}
public async Task<bool> DeleteWithStoredProcedureAsync(int id, CancellationToken cancellationToken = default)
{
return await DeleteAsync(id, cancellationToken);
}
private async Task<Catalog?> UpsertWithStoredProcedureAsync(Catalog catalog, CancellationToken cancellationToken)
{
var guidParam = new SqlParameter("@GUID", SqlDbType.Int)
{
Direction = ParameterDirection.InputOutput,
Value = catalog.Guid == 0 ? DBNull.Value : catalog.Guid
};
var catTitleParam = new SqlParameter("@CAT_TITLE", catalog.CatTitle);
var catStringParam = new SqlParameter("@CAT_STRING", catalog.CatString);
var changedWhoParam = new SqlParameter("@CHANGED_WHO", (object?)catalog.ChangedWho ?? DBNull.Value);
await _db.Database.ExecuteSqlRawAsync(
"EXEC dbo.PRTBMY_CATALOG_UPDATE @CAT_TITLE, @CAT_STRING, @CHANGED_WHO, @GUID OUTPUT",
parameters: new[] { catTitleParam, catStringParam, changedWhoParam, guidParam },
cancellationToken: cancellationToken);
if (guidParam.Value == DBNull.Value)
{
return null;
}
var guid = (int)guidParam.Value;
var viewRow = await _db.VwmyCatalogs.AsNoTracking().FirstOrDefaultAsync(x => x.Guid == guid, cancellationToken);
return viewRow == null ? null : _mapper.Map<Catalog>(viewRow);
}
}