Я пытаюсь сделать так, чтобы оно отказывалось вставлять музыку в базу данных, если в нем уже существует файл с таким же названием и автором. Я хочу, чтобы он выдавал исключение
Музыка с таким названием и тем же автором уже существует
Пока это работает, выбрасывая исключение, когда обнаруживает, что уникальное ограничение на заголовок и автора в базе данных не выполнено, но я все еще сомневаюсь, что все находится именно на своем месте.
/>Вот что у меня есть на данный момент:
Код: Выделить всё
Music.csКод: Выделить всё
namespace Domain;
public partial class Music
{
public int Id { get; set; }
public string Title { get; set; } = null!;
public string Author { get; set; } = null!;
public string Type { get; set; } = null!;
public string YoutubeUrl { get; set; } = null!;
public int UserId { get; set; }
public virtual User User { get; set; } = null!;
public virtual ICollection Votes { get; set; } = new List();
}
Код: Выделить всё
UseCaseCreateMusic.cs:
using Application.UseCases.Music.Dtos;
using Application.UseCases.Utils;
using AutoMapper;
using Infrastructure.Repositories;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
namespace Application.UseCases.Music;
public class UseCaseCreateMusic : IUseCaseWriter
{
private readonly IMusicRepository _musicRepository;
private readonly IMapper _mapper;
public UseCaseCreateMusic(IMusicRepository musicRepository, IMapper mapper)
{
_musicRepository = musicRepository;
_mapper = mapper;
}
public DtoOutputMusic Execute(DtoInputMusic input)
{
var music = _mapper.Map(input);
try
{
var dbMusic = _musicRepository.Create(music.Title, music.Author, music.Type, music.YoutubeUrl, music.UserId);
return _mapper.Map(dbMusic);
}
catch (DbUpdateException ex) when (ex.InnerException is SqlException sqlEx && sqlEx.Number == 2627)
{
throw new InvalidOperationException("A music with the same title and same author already exists.", ex);
}
catch (Exception ex)
{
throw new InvalidOperationException($"An error occurred: {ex.Message}");
}
}
}
Код: Выделить всё
DtoInputMusic.csКод: Выделить всё
using System.ComponentModel.DataAnnotations;
namespace Application.UseCases.Music.Dtos;
public class DtoInputMusic
{
[StringLength(100, MinimumLength = 2)]
[Required]
public string Title { get; set; }
[StringLength(100, MinimumLength = 2)]
[Required]
public string Author { get; set; }
[StringLength(50, MinimumLength = 2)]
[Required]
public string Type { get; set; }
[RegularExpression(@"^(https?\:\/\/)?(www\.youtube\.com|youtu\.be)\/.+$")]
[Required]
[StringLength(500)]
public string YoutubeUrl { get; set; }
[Required]
public int UserId { get; set; }
}
Можно ли поместить в приложение бизнес-логику? Можете ли вы меня просветить?
Заранее спасибо за помощь.
Подробнее здесь: https://stackoverflow.com/questions/793 ... chitecture
Мобильная версия