При уникальном имени, не бросать исключение DuplicateEntry, а взять уже существующий

109
18 апреля 2021, 06:00

Можно ли при добавлении объекта, без дополнительного поиска вставить индекс на существующий объект, если его имя должно быть уникальным?

Т.е.:

public class SerialInfo
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string TitleOriginal { get; set; }
    public string Description { get; set; }
    public Uri PreviewImageUri { get; set; }
    public bool IsMovie { get; set; }
    public uint? SeriesCount { get; set; }
    public uint? CurrentSeriesCount { get; set; }
    public virtual Studio Studio { get; set; }
    public int Year { get; set; }
    public virtual List<SerialGenre> Genres { get; set; }
    public FullSerialInfo FullInfo { get; set; }
}

Где к примеру у поля Studio уникальное имя, т.е. не должно быть дубликатов, и когда при попытке добавления сериала, такая студия уже существует, то получается исключение:

MySqlException: Duplicate entry 'Some StudioName' for key 'IX_Producers_Name'

Можно ли без поиска студии сделать так, что бы если она уже есть, просто добавился ее ключ?

На данный момент, все это делаю вот так:

[HttpPost]
public async Task<ActionResult<SerialInfo>> PostSerialInfo(SerialInfo serialInfo)
{
    if (SerialInfoExists(new KeyValuePair<string, string>(serialInfo.Title, serialInfo.TitleOriginal),
        out SerialInfo fInfo))
    {
        return RedirectToAction("GetSerialInfo", new {id = fInfo.Id});
    }
    Studio existingStudio = _context.Studios.FirstOrDefault(studio =>
        string.Equals(serialInfo.Studio.Name.Trim(), studio.Name, StringComparison.InvariantCultureIgnoreCase));
    Producer existingProducer = _context.Producers.FirstOrDefault(producer =>
        string.Equals(serialInfo.FullInfo.Producer.Name.Trim(), producer.Name, StringComparison.InvariantCultureIgnoreCase));
    if (existingStudio != null)
    {
        serialInfo.Studio = existingStudio;
    }
    if (existingProducer != null)
    {
        serialInfo.FullInfo.Producer = existingProducer;
    }
    _context.Serials.Add(serialInfo);
    await _context.SaveChangesAsync();
    return CreatedAtAction("GetSerialInfo", new {id = serialInfo.Id}, serialInfo);
}
READ ALSO
Отсечение лишних кортежей

Отсечение лишних кортежей

Всем привет, есть вот такая выборка из БД

126
Оптимизация запроса под Firebird сервер 2.0

Оптимизация запроса под Firebird сервер 2.0

Вопрос перекочевал с этого поста stackoverflow Нужно поправить запрос под Firebird 20

109