Refactored CatalogRepository to set @GUID as an OUTPUT parameter when calling PRTBMY_CATALOG_UPDATE. Now, after execution, the code checks the returned GUID value and uses it to fetch the updated catalog entry, handling cases where the GUID is null or zero. This ensures the repository returns the correct catalog record as modified by the stored procedure.
108 lines
3.8 KiB
C#
108 lines
3.8 KiB
C#
using DbFirst.Domain.Repositories;
|
|
using DbFirst.Domain.Entities;
|
|
using Microsoft.Data.SqlClient;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using System.Data;
|
|
|
|
namespace DbFirst.Infrastructure.Repositories;
|
|
|
|
public class CatalogRepository : ICatalogRepository
|
|
{
|
|
private readonly ApplicationDbContext _db;
|
|
|
|
public CatalogRepository(ApplicationDbContext db)
|
|
{
|
|
_db = db;
|
|
}
|
|
|
|
public async Task<List<VwmyCatalog>> GetAllAsync(CancellationToken cancellationToken = default)
|
|
{
|
|
return await _db.VwmyCatalogs.AsNoTracking().ToListAsync(cancellationToken);
|
|
}
|
|
|
|
public async Task<VwmyCatalog?> GetByIdAsync(int id, CancellationToken cancellationToken = default)
|
|
{
|
|
return await _db.VwmyCatalogs.AsNoTracking().FirstOrDefaultAsync(x => x.Guid == id, cancellationToken);
|
|
}
|
|
|
|
public async Task<VwmyCatalog> InsertAsync(VwmyCatalog catalog, CancellationToken cancellationToken = default)
|
|
{
|
|
var guidParam = new SqlParameter("@GUID", SqlDbType.Int)
|
|
{
|
|
Direction = ParameterDirection.Output
|
|
};
|
|
|
|
var catTitleParam = new SqlParameter("@CAT_TITLE", catalog.CatTitle);
|
|
var catStringParam = new SqlParameter("@CAT_STRING", catalog.CatString);
|
|
var addedWhoParam = new SqlParameter("@ADDED_WHO", (object?)catalog.AddedWho ?? DBNull.Value);
|
|
|
|
await _db.Database.ExecuteSqlRawAsync(
|
|
"EXEC dbo.PRTBMY_CATALOG_INSERT @CAT_TITLE, @CAT_STRING, @ADDED_WHO, @GUID OUTPUT",
|
|
parameters: new[] { catTitleParam, catStringParam, addedWhoParam, guidParam },
|
|
cancellationToken: cancellationToken);
|
|
|
|
if (guidParam.Value == DBNull.Value)
|
|
{
|
|
throw new InvalidOperationException("Failed to insert catalog via stored procedure.");
|
|
}
|
|
|
|
var guid = (int)guidParam.Value;
|
|
var created = await _db.VwmyCatalogs.AsNoTracking().FirstOrDefaultAsync(x => x.Guid == guid, cancellationToken);
|
|
if (created == null)
|
|
{
|
|
throw new InvalidOperationException("Inserted catalog could not be loaded from view.");
|
|
}
|
|
|
|
return created;
|
|
}
|
|
|
|
public async Task<VwmyCatalog?> UpdateAsync(int id, VwmyCatalog catalog, CancellationToken cancellationToken = default)
|
|
{
|
|
catalog.Guid = id;
|
|
|
|
var guidParam = new SqlParameter("@GUID", SqlDbType.Int)
|
|
{
|
|
Direction = ParameterDirection.Output
|
|
};
|
|
|
|
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;
|
|
if (guid == 0)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return await _db.VwmyCatalogs.AsNoTracking().FirstOrDefaultAsync(x => x.Guid == guid, cancellationToken);
|
|
}
|
|
|
|
public async Task<bool> DeleteAsync(int id, CancellationToken cancellationToken = default)
|
|
{
|
|
var exists = await _db.VwmyCatalogs.AsNoTracking().AnyAsync(x => x.Guid == id, cancellationToken);
|
|
if (!exists)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
var guidParam = new SqlParameter("@GUID", id);
|
|
await _db.Database.ExecuteSqlRawAsync(
|
|
"EXEC dbo.PRTBMY_CATALOG_DELETE @GUID",
|
|
parameters: new[] { guidParam },
|
|
cancellationToken: cancellationToken);
|
|
|
|
return true;
|
|
}
|
|
}
|