У меня есть одна таблица в базе данных с именем Users
Users
------
ID (PK, Identity)
Username (Unique Index)
Я установил уникальный индекс в таблице имени пользователя, чтобы избежать дублирования. Затем я перечисляю коллекцию и создаю нового пользователя в базе данных для каждого элемента.
Что я хочу сделать, это просто вставить нового пользователя и проигнорировать исключение, если ограничение уникального ключа нарушено (поскольку в данном случае это явно дублирующая запись). Это сделано для того, чтобы избежать необходимости создавать там, где не существует вид запросов.
Во-первых, это будет более эффективным или вместо этого мой код вставки будет проверять наличие дубликатов? Я больше обращаюсь к базе данных с такой логикой, поскольку это предотвращает вставку дублирующихся данных любым другим типом клиентов.
Моя другая проблема связана с LINQ To SQL. У меня есть следующий код:
public class TestRepo
{
DatabaseDataContext database = new DatabaseDataContext();
public void Add(string username)
{
database.Users.InsertOnSubmit(new User() { Username = username });
}
public void Save()
{
database.SubmitChanges();
}
}
А затем я перебираю коллекцию и вставляю новых пользователей, игнорируя любые исключения:
TestRepo repo = new TestRepo();
foreach (var name in new string[] { "Tim", "Bob", "John" })
{
try
{
repo.Add(name);
repo.Save();
}
catch { }
}
При первом запуске, отлично, у меня в таблице три пользователя. Если я удаляю второй и снова запускаю этот код, ничего не вставляется. Я ожидал, что первая вставка потерпит неудачу с исключением, вторая будет успешной (так как я только что удалил этот элемент из БД), а третья - неудачной.
То, что, похоже, происходит, заключается в том, что после создания исключения SqlException (даже если цикл продолжает повторяться) все последующие операции вставки завершаются неудачно - даже когда в таблице нет строки, которая могла бы вызвать уникальное нарушение.
Может кто-нибудь объяснить это?
P.S. Единственный обходной путь, который я смог найти, состоял в том, чтобы создавать экземпляр репо каждый раз перед вставкой, затем он работал точно так же, как и предполагалось, что указывает на то, что это как-то связано с LINQ To SQL DataContext.
Спасибо.