Проверьте наличие записи перед вставкой новой записи - PullRequest
11 голосов
/ 15 февраля 2012

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

Я погуглил, но не нашел ответа на этот вопрос.

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

}

Ответы [ 5 ]

16 голосов
/ 15 февраля 2012

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

var existingAuthorCount = publishContext.Author.Count(a => a.AuthodSSID == 20);
if (existingAuthorCount == 0) 
{
    // Do your insert
}
12 голосов
/ 15 февраля 2012

Как-то так должно работать:

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.
2 голосов
/ 30 марта 2017

В EF v5.0 доступна так называемая операция "upsert" +

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

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

using System.Data.Entity.Migrations;

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

2 голосов
/ 22 октября 2012

Я лично предпочитаю такой подход с точки зрения .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;
}
0 голосов
/ 15 февраля 2012

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

Метод Where() вернет коллекцию авторов, которая вам нужна, поэтому вы используете FirstOrDefault(), которыйвозвращает первый элемент или ноль, если ничего нет.Вы также можете использовать 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...