Дублирующая запись не вызывает вставки записи - PullRequest
0 голосов
/ 17 декабря 2018

Пожалуйста, рассмотрите этот сценарий:

У меня есть две таблицы: Temp и Convert.Структура этих двух таблиц точно такая же.Я хочу сделать некоторые операции с каждой записью Temp и добавить ее в таблицу Convert.Выполняя мою работу, в таблице Convert могут быть повторяющиеся записи, поэтому я не хочу вставлять эту запись в таблицу Convert.Я написал этот код:

foreach (var item in allRecords)
{
    var converted = new Convert()
    {
        F1 = item.F1,
        F2 = item.F2,
        F3 = DoWork(F3),
    };

    try
    {
        context.Convert.AddObject(converted);
        context.SaveChanges();
    }
    catch (Exception ex)
    {
        var msg = "Violation of PRIMARY KEY constraint 'PK_Convert'." 
                  + " Cannot insert duplicate key":

        if (ex.InnerException.Message.Contains(msg))
        {
            continue;
        }
        else
        {
             throw ex;
        }
    }
}

проблема в том, что когда я получаю исключение для первого дубликата и continue выполненная команда, кажется, что дублирующаяся запись не сбрасывается и все еще ожидает сохранения.После первого исключения No Нет записей в базе данных из-за моей первой ошибки дублирования.Как я могу решить эту проблему, не проверяя наличие повторяющейся ошибки в таблице Convert? 1014 *

Спасибо

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018
var converted = new Convert()
    {
        F1 = item.F1,
        F2 = item.F2,
        F3 = DoWork(F3),
    };

Поскольку F3 - ваш первичный ключ, просто проверьте, существует ли он перед вставкой:

if(context.Convert.Any(x => x.F3 == converted.F3)
{
    //deal with the error
}
else
{
     context.Convert.AddObject(converted);
     context.SaveChanges();
}
0 голосов
/ 17 декабря 2018

Вы можете попробовать проверить, существует ли сущность, а если нет - добавить ее?Например:

using System.Linq.Expressions;
public class ContextWithExtensionExample
{
    public void DoSomeContextWork(DbContext context)
    {
        var uni = new Unicorn();
        context.Set<Unicorn>().AddIfNotExists(uni , x => x.Name == "James");
     }
}

public static class DbSetExtensions
{
    public static T AddIfNotExists<T>(this DbSet<T> dbSet, T entity, Expression<Func<T, bool>> predicate = null) where T : class, new()
    {
        var exists = predicate != null ? dbSet.Any(predicate) : dbSet.Any();
        return !exists ? dbSet.Add(entity) : null;
    }
}

Вы можете использовать этот метод напрямую и не забывать вызывать DbContext.SaveChanges () после вызова.

...