Я пытаюсь сделать так, чтобы оно отказывалось вставлять музыку в базу данных, если в нем уже существует файл с таким же названием и автором. Я хочу, чтобы он выдавал исключение, говорящее: «Музыка с таким же названием и тем же автором уже существует».
Пока это работает, выдавая исключение, когда обнаруживается уникальное ограничение по названию и автору в базе данных не работает, но я все еще сомневаюсь, что все на своих местах.
Вот что у меня пока:
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();
}
Код: Выделить всё
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}");
}
}
}
Код: Выделить всё
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