feat(dal, api): в таблицах Process, Subprocess, Tnks, Works поле EsppId - уникальное. Обновлены соответсвующе контроллеры (валидация esppId), добавлены методы удаления если нет дочерних элементов.
This commit is contained in:
@@ -46,40 +46,6 @@ namespace PARR.API.Controllers.V1
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Создать процесс
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="request"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpPost(ApiRoutes.Process.Create)]
|
|
||||||
public async Task<IActionResult> Create([FromBody] ProcessRequest request)
|
|
||||||
{
|
|
||||||
var resultValidate = await validator.ValidateAsync(request);
|
|
||||||
if (!resultValidate.IsValid)
|
|
||||||
return BadRequest(new Response(resultValidate.Errors));
|
|
||||||
|
|
||||||
var existName = await processService.Get().FirstOrDefaultAsync(t => t.Name == request.Name);
|
|
||||||
if (existName != null)
|
|
||||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Процесс с именем \"{request.Name}\" уже существует." } }));
|
|
||||||
|
|
||||||
var process = new Process
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid(),
|
|
||||||
Name = request.Name,
|
|
||||||
EsppId = request.EsppId
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!await processService.CreateAsync(process) || !await processService.CommitAsync())
|
|
||||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при записи нового процесса в базу данных" } }));
|
|
||||||
|
|
||||||
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил процесс: {process.Name}, {process.EsppId}");
|
|
||||||
|
|
||||||
var locationUri = uriService.GetUri(ApiRoutes.Process.Get, ApiRoutes.Process.getParam, process.Id);
|
|
||||||
|
|
||||||
return Created(locationUri, new Response<ProcessResponse>(mapper.Map<ProcessResponse>(process), true));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Список процессов постранично
|
/// Список процессов постранично
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -146,6 +112,44 @@ namespace PARR.API.Controllers.V1
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Создать процесс
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="request"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost(ApiRoutes.Process.Create)]
|
||||||
|
public async Task<IActionResult> Create([FromBody] ProcessRequest request)
|
||||||
|
{
|
||||||
|
var resultValidate = await validator.ValidateAsync(request);
|
||||||
|
if (!resultValidate.IsValid)
|
||||||
|
return BadRequest(new Response(resultValidate.Errors));
|
||||||
|
|
||||||
|
var existName = await processService.Get().FirstOrDefaultAsync(t => t.Name.ToLower() == request.Name.ToLower().Trim());
|
||||||
|
if (existName != null)
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Процесс с именем \"{request.Name}\" уже существует." } }));
|
||||||
|
|
||||||
|
var existEsppId = await processService.Get().FirstOrDefaultAsync(t => t.EsppId == request.EsppId);
|
||||||
|
if (existEsppId != null)
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"Процесс с EsppId: {request.EsppId} уже существует." } }));
|
||||||
|
|
||||||
|
var process = new Process
|
||||||
|
{
|
||||||
|
Id = Guid.NewGuid(),
|
||||||
|
Name = request.Name.Trim(),
|
||||||
|
EsppId = request.EsppId
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!await processService.CreateAsync(process) || !await processService.CommitAsync())
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при добавлении процесса." } }));
|
||||||
|
|
||||||
|
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил процесс: {process.Name}, {process.EsppId}");
|
||||||
|
|
||||||
|
var locationUri = uriService.GetUri(ApiRoutes.Process.Get, ApiRoutes.Process.getParam, process.Id);
|
||||||
|
|
||||||
|
return Created(locationUri, new Response<ProcessResponse>(mapper.Map<ProcessResponse>(process), true));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Обновить процесс
|
/// Обновить процесс
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -159,17 +163,21 @@ namespace PARR.API.Controllers.V1
|
|||||||
if (!resultValidate.IsValid)
|
if (!resultValidate.IsValid)
|
||||||
return BadRequest(new Response(resultValidate.Errors));
|
return BadRequest(new Response(resultValidate.Errors));
|
||||||
|
|
||||||
var orig = await processService.Get()
|
//проверка на уникальность esppId
|
||||||
.FirstOrDefaultAsync(t => t.Id == id);
|
var existEsppId = await processService.Get().FirstOrDefaultAsync(t => t.Id != id && t.EsppId == request.EsppId);
|
||||||
|
if (existEsppId != null)
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"Уже есть процесс с EsppId: {request.EsppId}" } }));
|
||||||
|
|
||||||
|
var orig = await processService.Get().FirstOrDefaultAsync(t => t.Id == id);
|
||||||
|
|
||||||
if (orig == null)
|
if (orig == null)
|
||||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении процесса. Не найден процесс Id: {id}" } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении процесса." } }));
|
||||||
|
|
||||||
orig.Name = request.Name;
|
orig.Name = request.Name.Trim();
|
||||||
orig.EsppId = request.EsppId;
|
orig.EsppId = request.EsppId;
|
||||||
|
|
||||||
if (!await processService.CommitAsync())
|
if (!await processService.CommitAsync())
|
||||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка записи в базу данных изменений процесса." } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при изменении процесса." } }));
|
||||||
|
|
||||||
logger.LogInformation($"Пользователь {User.Identity?.Name} обновил процесс: {orig.Id}, {orig.Name}, {orig.EsppId}");
|
logger.LogInformation($"Пользователь {User.Identity?.Name} обновил процесс: {orig.Id}, {orig.Name}, {orig.EsppId}");
|
||||||
|
|
||||||
@@ -178,24 +186,27 @@ namespace PARR.API.Controllers.V1
|
|||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Удалить подпроцесс
|
/// Удалить процесс (если у него нет подпроцессов)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="id"></param>
|
/// <param name="id"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
//[HttpDelete(ApiRoutes.Process.Delete)]
|
[HttpDelete(ApiRoutes.Process.Delete)]
|
||||||
//public async Task<IActionResult> Delete([FromRoute] Guid id)
|
public async Task<IActionResult> Delete([FromRoute] Guid id)
|
||||||
//{
|
{
|
||||||
// var process = await processService.GetAsync(id);
|
var process = await processService.Get().Include(t => t.Subprocesses).FirstOrDefaultAsync(t => t.Id == id);
|
||||||
|
|
||||||
// if (process == null)
|
if (process == null)
|
||||||
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении процесса. Не найден процесс Id: {id}" } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении процесса." } }));
|
||||||
|
|
||||||
// if (!processService.Delete(process) || !await processService.CommitAsync())
|
if (process.Subprocesses.Any())
|
||||||
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении процесса из базы данных" } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении процесса. У данного процесса есть подпроцессы ({process.Subprocesses.Count()} шт.)" } }));
|
||||||
|
|
||||||
// logger.LogInformation($"Пользователь {User.Identity?.Name} удалил процесс: {process.Id}, {process.Name}, {process.EsppId}");
|
if (!processService.Delete(process) || !await processService.CommitAsync())
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении процесса." } }));
|
||||||
|
|
||||||
// return NoContent();
|
logger.LogInformation($"Пользователь {User.Identity?.Name} удалил процесс: {process.Id}, {process.Name}, {process.EsppId}");
|
||||||
//}
|
|
||||||
|
return NoContent();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -128,20 +128,24 @@ namespace PARR.API.Controllers.V1
|
|||||||
if (!resultValidate.IsValid)
|
if (!resultValidate.IsValid)
|
||||||
return BadRequest(new Response(resultValidate.Errors));
|
return BadRequest(new Response(resultValidate.Errors));
|
||||||
|
|
||||||
var existName = await subprocessService.Get().FirstOrDefaultAsync(t => t.Name == request.Name);
|
var existName = await subprocessService.Get().FirstOrDefaultAsync(t => t.Name.ToLower() == request.Name.Trim().ToLower());
|
||||||
if (existName != null)
|
if (existName != null)
|
||||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Подпроцесс с именем \"{request.Name}\" уже существует." } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Подпроцесс с именем \"{request.Name}\" уже существует." } }));
|
||||||
|
|
||||||
|
var existEsppId = await subprocessService.Get().FirstOrDefaultAsync(t => t.EsppId == request.EsppId);
|
||||||
|
if (existEsppId != null)
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"Подпроцесс с EsppId: {request.EsppId} уже существует." } }));
|
||||||
|
|
||||||
var subprocess = new Subprocess
|
var subprocess = new Subprocess
|
||||||
{
|
{
|
||||||
Id = Guid.NewGuid(),
|
Id = Guid.NewGuid(),
|
||||||
Name = request.Name,
|
Name = request.Name.Trim(),
|
||||||
EsppId = request.EsppId,
|
EsppId = request.EsppId,
|
||||||
ProcessId = request.ProcessId,
|
ProcessId = request.ProcessId,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!await subprocessService.CreateAsync(subprocess) || !await subprocessService.CommitAsync())
|
if (!await subprocessService.CreateAsync(subprocess) || !await subprocessService.CommitAsync())
|
||||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при записи нового подпроцесса в базу данных" } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при добавлении подпроцесса." } }));
|
||||||
|
|
||||||
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил подпроцесс: {subprocess.Name}, {subprocess.EsppId}, {subprocess.ProcessId}");
|
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил подпроцесс: {subprocess.Name}, {subprocess.EsppId}, {subprocess.ProcessId}");
|
||||||
|
|
||||||
@@ -151,8 +155,6 @@ namespace PARR.API.Controllers.V1
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Обновить подпроцесс
|
/// Обновить подпроцесс
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -166,13 +168,17 @@ namespace PARR.API.Controllers.V1
|
|||||||
if (!resultValidate.IsValid)
|
if (!resultValidate.IsValid)
|
||||||
return BadRequest(new Response(resultValidate.Errors));
|
return BadRequest(new Response(resultValidate.Errors));
|
||||||
|
|
||||||
var orig = await subprocessService.Get()
|
//проверка на уникальность esppId
|
||||||
.FirstOrDefaultAsync(t => t.Id == id);
|
var existEsppId = await subprocessService.Get().FirstOrDefaultAsync(t => t.Id != id && t.EsppId == request.EsppId);
|
||||||
|
if (existEsppId != null)
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"Уже есть подпроцесс с EsppId: {request.EsppId}" } }));
|
||||||
|
|
||||||
|
var orig = await subprocessService.Get().FirstOrDefaultAsync(t => t.Id == id);
|
||||||
|
|
||||||
if (orig == null)
|
if (orig == null)
|
||||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении подпроцесса. Не найден подпроцесс Id: {id}" } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении подпроцесса. Не найден подпроцесс Id: {id}" } }));
|
||||||
|
|
||||||
orig.Name = request.Name;
|
orig.Name = request.Name.Trim();
|
||||||
orig.EsppId = request.EsppId;
|
orig.EsppId = request.EsppId;
|
||||||
orig.ProcessId = request.ProcessId;
|
orig.ProcessId = request.ProcessId;
|
||||||
|
|
||||||
@@ -186,24 +192,27 @@ namespace PARR.API.Controllers.V1
|
|||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Удалить подпроцесс
|
/// Удалить подпроцесс (если у него нет ТНК)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="id"></param>
|
/// <param name="id"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
//[HttpDelete(ApiRoutes.Subprocess.Delete)]
|
[HttpDelete(ApiRoutes.Subprocess.Delete)]
|
||||||
//public async Task<IActionResult> Delete([FromRoute] Guid id)
|
public async Task<IActionResult> Delete([FromRoute] Guid id)
|
||||||
//{
|
{
|
||||||
// var subprocess = await subprocessService.GetAsync(id);
|
var subprocess = await subprocessService.Get().Include(t=>t.Tnks).FirstOrDefaultAsync(t=>t.Id==id);
|
||||||
|
|
||||||
// if (subprocess == null)
|
if (subprocess == null)
|
||||||
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении подпроцесса. Не найден подпроцесс Id: {id}" } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении подпроцесса." } }));
|
||||||
|
|
||||||
// if (!subprocessService.Delete(subprocess) || !await subprocessService.CommitAsync())
|
if (subprocess.Tnks.Any())
|
||||||
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении подпроцесса из базы данных" } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении подпроцесса. У данного подпроцесса есть ТНК ({subprocess.Tnks.Count()} шт.)" } }));
|
||||||
|
|
||||||
// logger.LogInformation($"Пользователь {User.Identity?.Name} удалил подпроцесс: {subprocess.Id}, {subprocess.Name}, {subprocess.EsppId}, {subprocess.ProcessId}");
|
if (!subprocessService.Delete(subprocess) || !await subprocessService.CommitAsync())
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении подпроцесса." } }));
|
||||||
|
|
||||||
// return NoContent();
|
logger.LogInformation($"Пользователь {User.Identity?.Name} удалил подпроцесс: {subprocess.Id}, {subprocess.Name}, {subprocess.EsppId}, {subprocess.ProcessId}");
|
||||||
//}
|
|
||||||
|
return NoContent();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -128,20 +128,24 @@ namespace PARR.API.Controllers.V1
|
|||||||
if (!resultValidate.IsValid)
|
if (!resultValidate.IsValid)
|
||||||
return BadRequest(new Response(resultValidate.Errors));
|
return BadRequest(new Response(resultValidate.Errors));
|
||||||
|
|
||||||
var existName = await tnkService.Get().FirstOrDefaultAsync(t => t.Name == request.Name);
|
var existName = await tnkService.Get().FirstOrDefaultAsync(t => t.Name.ToLower() == request.Name.Trim().ToLower());
|
||||||
if (existName != null)
|
if (existName != null)
|
||||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Вид работы с именем \"{request.Name}\" уже существует." } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Вид работы с именем \"{request.Name}\" уже существует." } }));
|
||||||
|
|
||||||
|
var existEsppId = await tnkService.Get().FirstOrDefaultAsync(t => t.EsppId == request.EsppId);
|
||||||
|
if (existEsppId != null)
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"ТНК с EsppId: {request.EsppId} уже существует." } }));
|
||||||
|
|
||||||
var tnk = new Tnk
|
var tnk = new Tnk
|
||||||
{
|
{
|
||||||
Id = Guid.NewGuid(),
|
Id = Guid.NewGuid(),
|
||||||
Name = request.Name,
|
Name = request.Name.Trim(),
|
||||||
EsppId = request.EsppId,
|
EsppId = request.EsppId,
|
||||||
SubprocessId = request.SubprocessId,
|
SubprocessId = request.SubprocessId,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!await tnkService.CreateAsync(tnk) || !await tnkService.CommitAsync())
|
if (!await tnkService.CreateAsync(tnk) || !await tnkService.CommitAsync())
|
||||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при записи новой ТНК в базу данных" } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка добавлении ТНК." } }));
|
||||||
|
|
||||||
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил ТНК: {tnk.Name}, {tnk.EsppId}, {tnk.SubprocessId}");
|
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил ТНК: {tnk.Name}, {tnk.EsppId}, {tnk.SubprocessId}");
|
||||||
|
|
||||||
@@ -164,18 +168,23 @@ namespace PARR.API.Controllers.V1
|
|||||||
if (!resultValidate.IsValid)
|
if (!resultValidate.IsValid)
|
||||||
return BadRequest(new Response(resultValidate.Errors));
|
return BadRequest(new Response(resultValidate.Errors));
|
||||||
|
|
||||||
|
//проверка на уникальность esppId
|
||||||
|
var existEsppId = await tnkService.Get().FirstOrDefaultAsync(t => t.Id != id && t.EsppId == request.EsppId);
|
||||||
|
if (existEsppId != null)
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"Уже есть ТНК с EsppId: {request.EsppId}" } }));
|
||||||
|
|
||||||
var orig = await tnkService.Get()
|
var orig = await tnkService.Get()
|
||||||
.FirstOrDefaultAsync(t => t.Id == id);
|
.FirstOrDefaultAsync(t => t.Id == id);
|
||||||
|
|
||||||
if (orig == null)
|
if (orig == null)
|
||||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении ТНК. Не найдена ТНК Id: {id}" } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении ТНК." } }));
|
||||||
|
|
||||||
orig.Name = request.Name;
|
orig.Name = request.Name.Trim();
|
||||||
orig.EsppId = request.EsppId;
|
orig.EsppId = request.EsppId;
|
||||||
orig.SubprocessId = request.SubprocessId;
|
orig.SubprocessId = request.SubprocessId;
|
||||||
|
|
||||||
if (!await tnkService.CommitAsync())
|
if (!await tnkService.CommitAsync())
|
||||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка записи в базу данных изменений ТНК." } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при изменении ТНК." } }));
|
||||||
|
|
||||||
logger.LogInformation($"Пользователь {User.Identity?.Name} обновил ТНК: {orig.Id}, {orig.Name}, {orig.EsppId}, {orig.SubprocessId}");
|
logger.LogInformation($"Пользователь {User.Identity?.Name} обновил ТНК: {orig.Id}, {orig.Name}, {orig.EsppId}, {orig.SubprocessId}");
|
||||||
|
|
||||||
@@ -184,24 +193,27 @@ namespace PARR.API.Controllers.V1
|
|||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Удалить ТНК
|
/// Удалить ТНК (если у него нет работ)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="id"></param>
|
/// <param name="id"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
//[HttpDelete(ApiRoutes.Tnk.Delete)]
|
[HttpDelete(ApiRoutes.Tnk.Delete)]
|
||||||
//public async Task<IActionResult> Delete([FromRoute] Guid id)
|
public async Task<IActionResult> Delete([FromRoute] Guid id)
|
||||||
//{
|
{
|
||||||
// var tnk = await tnkService.GetAsync(id);
|
var tnk = await tnkService.Get().Include(t => t.Works).FirstOrDefaultAsync(t => t.Id == id);
|
||||||
|
|
||||||
// if (tnk == null)
|
if (tnk == null)
|
||||||
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении ТНК. Не найдена ТНК Id: {id}" } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении ТНК." } }));
|
||||||
|
|
||||||
// if (!tnkService.Delete(tnk) || !await tnkService.CommitAsync())
|
if (tnk.Works.Any())
|
||||||
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении ТНК из базы данных" } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении ТНК. У данного ТНК есть работы ({tnk.Works.Count()} шт.)" } }));
|
||||||
|
|
||||||
// logger.LogInformation($"Пользователь {User.Identity?.Name} удалил ТНК: {tnk.Id}, {tnk.Name}, {tnk.EsppId}, {tnk.SubprocessId}");
|
if (!tnkService.Delete(tnk) || !await tnkService.CommitAsync())
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении ТНК." } }));
|
||||||
|
|
||||||
// return NoContent();
|
logger.LogInformation($"Пользователь {User.Identity?.Name} удалил ТНК: {tnk.Id}, {tnk.Name}, {tnk.EsppId}, {tnk.SubprocessId}");
|
||||||
//}
|
|
||||||
|
return NoContent();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,41 +93,6 @@ namespace PARR.API.Controllers.V1
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Создать вид работы
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="request"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpPost(ApiRoutes.Work.Create)]
|
|
||||||
public async Task<IActionResult> Create([FromBody] WorkRequest request)
|
|
||||||
{
|
|
||||||
var resultValidate = await validator.ValidateAsync(request);
|
|
||||||
if (!resultValidate.IsValid)
|
|
||||||
return BadRequest(new Response(resultValidate.Errors));
|
|
||||||
|
|
||||||
var existName = await workService.Get().FirstOrDefaultAsync(t => t.Name == request.Name);
|
|
||||||
if (existName != null)
|
|
||||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Вид работы с именем \"{request.Name}\" уже существует." } }));
|
|
||||||
|
|
||||||
var work = new Work
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid(),
|
|
||||||
Name = request.Name,
|
|
||||||
EsppId = request.EsppId,
|
|
||||||
TnkId = request.TnkId,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!await workService.CreateAsync(work) || !await workService.CommitAsync())
|
|
||||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при создании вида работ." } }));
|
|
||||||
|
|
||||||
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил вид работ: {work.Name}, {work.EsppId}, {work.TnkId}");
|
|
||||||
|
|
||||||
var locationUri = uriService.GetUri(ApiRoutes.Work.Get, ApiRoutes.Work.getParam, work.Id);
|
|
||||||
|
|
||||||
return Created(locationUri, new Response<WorkResponse>(mapper.Map<WorkResponse>(work), true));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получить работу по id
|
/// Получить работу по id
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -148,6 +113,45 @@ namespace PARR.API.Controllers.V1
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Создать вид работы
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="request"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost(ApiRoutes.Work.Create)]
|
||||||
|
public async Task<IActionResult> Create([FromBody] WorkRequest request)
|
||||||
|
{
|
||||||
|
var resultValidate = await validator.ValidateAsync(request);
|
||||||
|
if (!resultValidate.IsValid)
|
||||||
|
return BadRequest(new Response(resultValidate.Errors));
|
||||||
|
|
||||||
|
var existName = await workService.Get().FirstOrDefaultAsync(t => t.Name.ToLower() == request.Name.Trim().ToLower());
|
||||||
|
if (existName != null)
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Вид работы с именем \"{request.Name}\" уже существует." } }));
|
||||||
|
|
||||||
|
var existEsppId = await workService.Get().FirstOrDefaultAsync(t => t.EsppId == request.EsppId);
|
||||||
|
if (existEsppId != null)
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"Вид работы с EsppId: {request.EsppId} уже существует." } }));
|
||||||
|
|
||||||
|
var work = new Work
|
||||||
|
{
|
||||||
|
Id = Guid.NewGuid(),
|
||||||
|
Name = request.Name.Trim(),
|
||||||
|
EsppId = request.EsppId,
|
||||||
|
TnkId = request.TnkId,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!await workService.CreateAsync(work) || !await workService.CommitAsync())
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при создании вида работ." } }));
|
||||||
|
|
||||||
|
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил вид работ: {work.Name}, {work.EsppId}, {work.TnkId}");
|
||||||
|
|
||||||
|
var locationUri = uriService.GetUri(ApiRoutes.Work.Get, ApiRoutes.Work.getParam, work.Id);
|
||||||
|
|
||||||
|
return Created(locationUri, new Response<WorkResponse>(mapper.Map<WorkResponse>(work), true));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Обновить вид работ
|
/// Обновить вид работ
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -161,13 +165,19 @@ namespace PARR.API.Controllers.V1
|
|||||||
if (!resultValidate.IsValid)
|
if (!resultValidate.IsValid)
|
||||||
return BadRequest(new Response(resultValidate.Errors));
|
return BadRequest(new Response(resultValidate.Errors));
|
||||||
|
|
||||||
|
//проверка на уникальность esppId
|
||||||
|
var existEsppId = await workService.Get().FirstOrDefaultAsync(t => t.Id != id && t.EsppId == request.EsppId);
|
||||||
|
if (existEsppId != null)
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"Уже есть вид работ с EsppId: {request.EsppId}" } }));
|
||||||
|
|
||||||
|
|
||||||
var orig = await workService.Get()
|
var orig = await workService.Get()
|
||||||
.FirstOrDefaultAsync(t => t.Id == id);
|
.FirstOrDefaultAsync(t => t.Id == id);
|
||||||
|
|
||||||
if (orig == null)
|
if (orig == null)
|
||||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении вида работ. Не найдена работа Id: {id}" } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении вида работ. Не найдена работа Id: {id}" } }));
|
||||||
|
|
||||||
orig.Name = request.Name;
|
orig.Name = request.Name.Trim();
|
||||||
orig.EsppId = request.EsppId;
|
orig.EsppId = request.EsppId;
|
||||||
orig.TnkId = request.TnkId;
|
orig.TnkId = request.TnkId;
|
||||||
|
|
||||||
@@ -181,25 +191,28 @@ namespace PARR.API.Controllers.V1
|
|||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Удалить вид работ
|
/// Удалить вид работ (если у него нет заданий (AppInWork))
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="id"></param>
|
/// <param name="id"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
//[HttpDelete(ApiRoutes.Work.Delete)]
|
[HttpDelete(ApiRoutes.Work.Delete)]
|
||||||
//public async Task<IActionResult> Delete([FromRoute] Guid id)
|
public async Task<IActionResult> Delete([FromRoute] Guid id)
|
||||||
//{
|
{
|
||||||
// var work = await workService.GetAsync(id);
|
var work = await workService.Get().Include(t => t.ApplicationsInWorks).FirstOrDefaultAsync(t => t.Id == id);
|
||||||
|
|
||||||
// if (work == null)
|
if (work == null)
|
||||||
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении вида работ. Не найдена работа, Id: {id}" } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении вида работ." } }));
|
||||||
|
|
||||||
// if (!workService.Delete(work) || !await workService.CommitAsync())
|
if (work.ApplicationsInWorks.Any())
|
||||||
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении вида работ." } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении вида работ. У данной работы есть задания ({work.ApplicationsInWorks.Count()} шт.)" } }));
|
||||||
|
|
||||||
// logger.LogInformation($"Пользователь {User.Identity?.Name} удалил вид работ: {work.Id}, {work.Name}, {work.EsppId}, {work.TnkId}");
|
if (!workService.Delete(work) || !await workService.CommitAsync())
|
||||||
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении вида работ." } }));
|
||||||
|
|
||||||
// return NoContent();
|
logger.LogInformation($"Пользователь {User.Identity?.Name} удалил вид работ: {work.Id}, {work.Name}, {work.EsppId}, {work.TnkId}");
|
||||||
//}
|
|
||||||
|
return NoContent();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,13 +5,11 @@ namespace PARR.API.Validators
|
|||||||
{
|
{
|
||||||
public class ProcessValidator : AbstractValidator<ProcessRequest>
|
public class ProcessValidator : AbstractValidator<ProcessRequest>
|
||||||
{
|
{
|
||||||
private bool? isValid = null;
|
|
||||||
|
|
||||||
public ProcessValidator()
|
public ProcessValidator()
|
||||||
{
|
{
|
||||||
RuleFor(t => t.Name).NotEmpty().NotNull().WithMessage("Имя процесса не может быть пустым");
|
RuleFor(t => t.Name).NotEmpty().NotNull();
|
||||||
|
|
||||||
RuleFor(t => t.EsppId).NotEmpty().NotNull().WithMessage("EsppId не может быть пустым");
|
RuleFor(t => t.EsppId).NotEmpty().NotNull();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,15 +15,15 @@ namespace PARR.API.Validators
|
|||||||
{
|
{
|
||||||
this.processService = processService;
|
this.processService = processService;
|
||||||
|
|
||||||
RuleFor(t => t.Name).NotEmpty().NotNull().WithMessage("Имя подпроцесса не может быть пустым");
|
RuleFor(t => t.Name).NotEmpty().NotNull();
|
||||||
|
|
||||||
RuleFor(t => t.EsppId).NotEmpty().NotNull().WithMessage("EsppId не может быть пустым");
|
RuleFor(t => t.EsppId).NotEmpty().NotNull();
|
||||||
|
|
||||||
RuleFor(t => t.ProcessId).NotEmpty().NotNull().WithMessage("Подпроцесс должна быть связан с процессом. ProcessId не может быть пустым");
|
RuleFor(t => t.ProcessId).NotEmpty().NotNull();
|
||||||
|
|
||||||
RuleFor(t => t.ProcessId)
|
RuleFor(t => t.ProcessId)
|
||||||
.MustAsync(async (entity, value, c) => await IsProcessExist(entity))
|
.MustAsync(async (entity, value, c) => await IsProcessExist(entity))
|
||||||
.WithMessage("У данного подпроцесса указан несуществующий Id процесса");
|
.WithMessage("Указан несуществующий Id процесса");
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<bool> IsProcessExist(SubprocessRequest request)
|
private async Task<bool> IsProcessExist(SubprocessRequest request)
|
||||||
|
|||||||
@@ -15,15 +15,15 @@ namespace PARR.API.Validators
|
|||||||
{
|
{
|
||||||
this.subprocessService = subprocessService;
|
this.subprocessService = subprocessService;
|
||||||
|
|
||||||
RuleFor(t => t.Name).NotEmpty().NotNull().WithMessage("Имя ТНК не может быть пустым");
|
RuleFor(t => t.Name).NotEmpty().NotNull();
|
||||||
|
|
||||||
RuleFor(t => t.EsppId).NotEmpty().NotNull().WithMessage("EsppId не может быть пустым");
|
RuleFor(t => t.EsppId).NotEmpty().NotNull().WithMessage("EsppId не может быть пустым");
|
||||||
|
|
||||||
RuleFor(t => t.SubprocessId).NotEmpty().NotNull().WithMessage("ТНК должна быть связана с подпроцессом. SubprocessId не может быть пустым");
|
RuleFor(t => t.SubprocessId).NotEmpty().NotNull();
|
||||||
|
|
||||||
RuleFor(t => t.SubprocessId)
|
RuleFor(t => t.SubprocessId)
|
||||||
.MustAsync(async (entity, value, c) => await IsSubprocessExist(entity))
|
.MustAsync(async (entity, value, c) => await IsSubprocessExist(entity))
|
||||||
.WithMessage("У данной ТНК указан несуществующий Id подпроцесса");
|
.WithMessage("Указан несуществующий Id подпроцесса");
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<bool> IsSubprocessExist(TnkRequest request)
|
private async Task<bool> IsSubprocessExist(TnkRequest request)
|
||||||
|
|||||||
@@ -16,15 +16,15 @@ namespace PARR.API.Validators
|
|||||||
{
|
{
|
||||||
this.tnkService = tnkService;
|
this.tnkService = tnkService;
|
||||||
|
|
||||||
RuleFor(t => t.Name).NotEmpty().NotNull().WithMessage("Имя работ не может быть пустым");
|
RuleFor(t => t.Name).NotEmpty().NotNull();
|
||||||
|
|
||||||
RuleFor(t => t.EsppId).NotEmpty().NotNull().WithMessage("EsppId не может быть пустым");
|
RuleFor(t => t.EsppId).NotEmpty().NotNull().WithMessage("EsppId не может быть пустым");
|
||||||
|
|
||||||
RuleFor(t => t.TnkId).NotEmpty().NotNull().WithMessage("Работа должна быть связана с ТНК. TnkId не может быть пустым");
|
RuleFor(t => t.TnkId).NotEmpty().NotNull();
|
||||||
|
|
||||||
RuleFor(t => t.TnkId)
|
RuleFor(t => t.TnkId)
|
||||||
.MustAsync(async (entity, value, c) => await IsTnkExist(entity))
|
.MustAsync(async (entity, value, c) => await IsTnkExist(entity))
|
||||||
.WithMessage("У данной работы указан несуществующий Id ТНК");
|
.WithMessage("Указан несуществующий Id ТНК");
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<bool> IsTnkExist(WorkRequest request)
|
private async Task<bool> IsTnkExist(WorkRequest request)
|
||||||
|
|||||||
2656
PARR.DAL/Migrations/20240519224359_tblProcessSubTnkWorkUniqueEsppId.Designer.cs
generated
Normal file
2656
PARR.DAL/Migrations/20240519224359_tblProcessSubTnkWorkUniqueEsppId.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,58 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace PARR.DAL.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class tblProcessSubTnkWorkUniqueEsppId : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Works_EsppId",
|
||||||
|
table: "Works",
|
||||||
|
column: "EsppId",
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Tnks_EsppId",
|
||||||
|
table: "Tnks",
|
||||||
|
column: "EsppId",
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Subprocesses_EsppId",
|
||||||
|
table: "Subprocesses",
|
||||||
|
column: "EsppId",
|
||||||
|
unique: true);
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Processes_EsppId",
|
||||||
|
table: "Processes",
|
||||||
|
column: "EsppId",
|
||||||
|
unique: true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropIndex(
|
||||||
|
name: "IX_Works_EsppId",
|
||||||
|
table: "Works");
|
||||||
|
|
||||||
|
migrationBuilder.DropIndex(
|
||||||
|
name: "IX_Tnks_EsppId",
|
||||||
|
table: "Tnks");
|
||||||
|
|
||||||
|
migrationBuilder.DropIndex(
|
||||||
|
name: "IX_Subprocesses_EsppId",
|
||||||
|
table: "Subprocesses");
|
||||||
|
|
||||||
|
migrationBuilder.DropIndex(
|
||||||
|
name: "IX_Processes_EsppId",
|
||||||
|
table: "Processes");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1539,6 +1539,9 @@ namespace PARR.DAL.Migrations
|
|||||||
|
|
||||||
b.HasKey("Id");
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("EsppId")
|
||||||
|
.IsUnique();
|
||||||
|
|
||||||
b.ToTable("Processes");
|
b.ToTable("Processes");
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1996,6 +1999,9 @@ namespace PARR.DAL.Migrations
|
|||||||
|
|
||||||
b.HasKey("Id");
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("EsppId")
|
||||||
|
.IsUnique();
|
||||||
|
|
||||||
b.HasIndex("ProcessId");
|
b.HasIndex("ProcessId");
|
||||||
|
|
||||||
b.ToTable("Subprocesses");
|
b.ToTable("Subprocesses");
|
||||||
@@ -2109,6 +2115,9 @@ namespace PARR.DAL.Migrations
|
|||||||
|
|
||||||
b.HasKey("Id");
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("EsppId")
|
||||||
|
.IsUnique();
|
||||||
|
|
||||||
b.HasIndex("SubprocessId");
|
b.HasIndex("SubprocessId");
|
||||||
|
|
||||||
b.ToTable("Tnks");
|
b.ToTable("Tnks");
|
||||||
@@ -2184,6 +2193,9 @@ namespace PARR.DAL.Migrations
|
|||||||
|
|
||||||
b.HasKey("Id");
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("EsppId")
|
||||||
|
.IsUnique();
|
||||||
|
|
||||||
b.HasIndex("TnkId");
|
b.HasIndex("TnkId");
|
||||||
|
|
||||||
b.ToTable("Works");
|
b.ToTable("Works");
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
using PARR.DAL.Models.Base;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using PARR.DAL.Models.Base;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
namespace PARR.DAL.Models
|
namespace PARR.DAL.Models
|
||||||
{
|
{
|
||||||
[Table("Processes")]
|
[Table("Processes")]
|
||||||
|
[Index(nameof(EsppId), IsUnique = true)]
|
||||||
public class Process : IBase
|
public class Process : IBase
|
||||||
{
|
{
|
||||||
[Key]
|
[Key]
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
using PARR.DAL.Models.Base;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using PARR.DAL.Models.Base;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
namespace PARR.DAL.Models
|
namespace PARR.DAL.Models
|
||||||
{
|
{
|
||||||
[Table("Subprocesses")]
|
[Table("Subprocesses")]
|
||||||
|
[Index(nameof(EsppId), IsUnique = true)]
|
||||||
public class Subprocess : IBase
|
public class Subprocess : IBase
|
||||||
{
|
{
|
||||||
[Key]
|
[Key]
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
using PARR.DAL.Models.Base;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using PARR.DAL.Models.Base;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
namespace PARR.DAL.Models
|
namespace PARR.DAL.Models
|
||||||
{
|
{
|
||||||
[Table("Tnks")]
|
[Table("Tnks")]
|
||||||
|
[Index(nameof(EsppId), IsUnique = true)]
|
||||||
public class Tnk : IBase
|
public class Tnk : IBase
|
||||||
{
|
{
|
||||||
[Key]
|
[Key]
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
using PARR.DAL.Models.Base;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using PARR.DAL.Models.Base;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
namespace PARR.DAL.Models
|
namespace PARR.DAL.Models
|
||||||
{
|
{
|
||||||
[Table("Works")]
|
[Table("Works")]
|
||||||
|
[Index(nameof(EsppId), IsUnique = true)]
|
||||||
public class Work : IBase
|
public class Work : IBase
|
||||||
{
|
{
|
||||||
[Key]
|
[Key]
|
||||||
|
|||||||
Reference in New Issue
Block a user