Intereting Posts
У вас есть CascadingDropDown, работающий с ASP.NET MVC? Как получить доступ к случайному элементу в списке? Загрузка листа Excel и импорт данных в базу данных SQL Server базовая концепция отправки sms-сообщений из приложения C # с использованием gsm-модема XF – SignaturePad показывает штрихи только тогда, когда касание заканчивается Преобразование строки в BASE62 Аутентификация клиент-сервер – с использованием SSPI? C # Высокое использование ЦП в streamе слушателя, отсоединение спальных промахов Добавление изображения из streamа памяти в документ Excel Загрузите файл excel со страницы через вызов WebApi MVC 4 – отношение «многие ко многим» и флажки Как преобразовать Active Directory pwdLastSet в Date / Time Задайте событие Double Click для элемента управления в Visual Studio Designer Сохранить изображение в базе данных с помощью ASP.NET MVC Удостоверьтесь, что controller имеет беззадачный публичный конструктор, используя Ninject

Проверьте наличие записи перед вставкой новой записи

Я использую Ado.net Entity Framework в первый раз, и мне нужно проверить, существует ли эта запись, прежде чем вставлять ее в базу данных. Я предпочитаю искать, если AuthodSSID существует, а не ключ (AuthorID). Я использую VS2010, Framework 4. System.Data.Entity – 3.5.0.0.

Я googled, но не нашел ответа на этот вопрос.

PublishingCompanyEntities publishContext; publishContext = new PublishingCompanyEntities(); private void createNew_Click(object sender, EventArgs e) { Author newAuthor = new Author(); newAuthor.FirstName = firstName.Text; newAuthor.LastName = lastName.Text; newAuthor.AuthodSSID = 20; newAuthor.AuthorID = 10 //Check if record exist here publishContext.AddToAuthor(newAuthor);//insert if does not exist } 

Единственный способ проверить, существует ли запись, – это запросить запись и посмотреть, вернется ли что-нибудь:

 var existingAuthorCount = publishContext.Author.Count(a => a.AuthodSSID == 20); if (existingAuthorCount == 0) { // Do your insert } 

Что-то вроде этого должно работать:

 if (publishContext.Author.Select(a => a.AuthodSSID).Where(id => id == 20).Take(1) == null) // It doesn't exist else // It does exist 

Основываясь на моем (хотя и фундаментальном) понимании, это должно приводить к выражению SQL, эквивалентному:

 SELECT TOP(1) AutodSSID FROM Author WHERE AuthodSSID = 20; 

Другим более простым подходом может быть использование метода расширения Any :

 if (!publishContext.Author.Any(a => a.AuthodSSID == 20)) // Put your insert logic here. 

Я лично предпочитаю этот подход с точки зрения .NET. Это чище, и если вы заботитесь о скорости (в .NET), она более эффективна, однако SQL не является такой вспышкой;

 private bool CheckIfEntityRecordExists(Entity e) { var retVal = false; using (var db = new EntityContext()) { retVal = db.AdviserClients.Any(a => a.Id == e.Id); } return retVal; } 

Таким образом, для эффективного оператора SQL лучше всего следующее:

 private bool CheckIfEntityRecordExists(Entity e) { var retVal = false; using (var db = new EntityContext()) { retVal = db.AdviserClients.Count(a => a.Id == e.Id) > 0; } return retVal; } 

В EF v5.0 + есть так называемая «upsert» операция,

 publishContext.Author.AddOrUpdate(x => x.Id, newAuthor) 

AddOrUpdate можно найти в пространстве имен «System.Data.Entity.Migrations», поэтому не забудьте добавить:

 using System.Data.Entity.Migrations; 

Операция AddOrUpdate не является атомарной. Но * if (existingAuthorCount == 0) {// Делаем вашу вставку} тоже.

Все, что вам нужно сделать, это поиск (с linq) для автора с этим идентификатором.

Метод Where() вернет коллекцию авторов, в которой вам нужен только один, поэтому вы используете FirstOrDefault() который возвращает первый элемент или null, если ничего нет. Вы также можете использовать SinglOrDefault который генерирует исключение, если в списке есть более одного элемента или просто возвращает этот элемент.

Кажется, @Jacob имеет отличный, более эффективный подход!

 var author = publishContext.Authors.Where (a=>a.AuthodSSID == 10).FirstOrDefault(); if(author == null) //none exist {//don't bother creating one unless you need to.. Author newAuthor = new Author(); newAuthor.FirstName = firstName.Text; newAuthor.LastName = lastName.Text; newAuthor.AuthodSSID = 20; newAuthor.AuthorID = 10 publishContext.AddToAuthor(newAuthor);//insert if does not exist }