Сохранение с уникальными ограничениями в Entity Framework [duplicate]

Вы можете изменить максимальную длину значения GROUP_CONCAT, установив параметр group_concat_max_len.

Подробнее см. в документации по MySQL .

35
задан Sinan ILYAS 20 July 2015 в 11:50
поделиться

4 ответа

// put this block in your loop
try
{
   // do your insert
}
catch(SqlException ex)
{
   // the exception alone won't tell you why it failed...
   if(ex.Number == 2627) // <-- but this will
   {
      //Violation of primary key. Handle Exception
   }
}

EDIT:

Вы также можете просто проверить компонент сообщения исключения. Что-то вроде этого:

if (ex.Message.Contains("UniqueConstraint")) // do stuff
6
ответ дан DeshDeep Singh 1 September 2018 в 10:24
поделиться
try
{
   // do your insert
}
catch(Exception ex)
{
   if (ex.GetBaseException().GetType() == typeof(SqlException))
   {
       Int32 ErrorCode = ((SqlException)ex.InnerException).Number;
       switch(ErrorCode)
       {
          case 2627:  // Unique constraint error
              break;
          case 547:   // Constraint check violation
              break;
          case 2601:  // Duplicated key row error
              break;
          default:
              break;
        }
    }
    else
    {
       // handle normal exception
    }
}
0
ответ дан husnain shabbir 1 September 2018 в 10:24
поделиться

Если вы хотите поймать уникальное ограничение

try { 
   // code here 
} 
catch(Exception ex) { 
   //check for Exception type as sql Exception 
   if(ex.GetBaseException().GetType() == typeof(SqlException)) { 
     //Violation of primary key/Unique constraint can be handled here. Also you may //check if Exception Message contains the constraint Name 
   } 
}
3
ответ дан JSantos 1 September 2018 в 10:24
поделиться

В моем случае я использую EF 6 и украсил одно из свойств моей модели:

[Index(IsUnique = true)]

Чтобы поймать нарушение, я делаю следующее, используя C # 7, это становится много проще:

protected async Task<IActionResult> PostItem(Item item)
{
  _DbContext.Items.Add(item);
  try
  {
    await _DbContext.SaveChangesAsync();
  }
  catch (DbUpdateException e)
  when (e.InnerException?.InnerException is SqlException sqlEx && 
    (sqlEx.Number == 2601 || sqlEx.Number == 2627))
  {
    return StatusCode(StatusCodes.Status409Conflict);
  }

  return Ok();
}

Обратите внимание, что это приведет к единственному нарушению ограничения индекса.

7
ответ дан Shimmy 1 September 2018 в 10:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: