Ошибка при запросе к БД через EntityFrameworkCore C#
Подскажите по работе с Microsoft.EntityFrameworkCore
У меня есть База Данных с номерами телефонов:
id
nomerPhone
где nomerPhone - уникальное значение
и когда я добавляю в БД номер телефона дублирующий, у меня возникает ошибка, как ее можно будет обойти? вот мой запрос на добавление:
async public Task AddPhoneBd(List<string> listPhone)
{
//подключаемся к БД
using (ApplicationContext db = new ApplicationContext())
{
var data = listPhone.Select(phone => new StructureBd() { nomerPhone = phone });
db.base_wa.AddRange(data);
//сохраняем изменения в БД
await db.SaveChangesAsync();
}
}
Ответы (1 шт):
Автор решения: Svyatoslav Danyliv
→ Ссылка
Вам надо переспросить у базы какие номера уже есть и не вставлять их:
async public Task AddPhoneBd(List<string> listPhone)
{
using (ApplicationContext db = new ApplicationContext())
{
var existing = db.base_wa
.Where(e => listPhone.Contains(e.nomerPhone))
.Select(e => e.nomerPhone);
var data = listPhone
.Except(existing)
.Select(phone => new StructureBd() { nomerPhone = phone });
db.base_wa.AddRange(data);
//сохраняем изменения в БД
await db.SaveChangesAsync();
}
}
По просьбам добавляю вариант на linq2db с использованием временных таблиц. Для этого придется поставить расширение linq2db.EntityFrameworkCore
class Phones
{
[Column] public string nomerPhone;
}
async public Task AddPhoneBd(List<string> listPhone)
{
var phonesData = listPhone.Select(n => new Phones { nomerPhone = n });
using (var db = new ApplicationContext())
using (var l2db = db.CreateLinqToDBConnection())
using (var tempTable = await l2db.CreateTempTableAsync("#Phones", phonesData)
{
var queryToInsert =
from d in tempTable
from p in db.base_wa.LeftJoin(p => p.nomerPhone == d.nomerPhone)
where p == null
select d;
await queryToInsert.InsertAsync(db.base_wa.ToLinqToDBTable(),
d => new StructureBd() { nomerPhone = d.nomerPhone });
}
}