Базовый метод GetOrAdd для Entity Framework - PullRequest
0 голосов
/ 28 ноября 2018

Я работаю над методом сообщения, который должен иметь действительно хорошую производительность.

У меня есть значение в теле запроса, которое будет искать в базе данных строку, связанную с этим значением, возвращать ее и добавлять в качестве внешнего ключа.

Итак, как это сейчас:

  1. Просмотрите базу данных и проверьте, существуют ли уже данные
  2. Если нет, добавьте их в базу данных
  3. Посмотрите, какие добавленные или уже существующие данные в базе данных, и присоедините их к объекту

Так что теперь есть 3 обращения к базе данных

Мне было интересно, есть ли какие-тоGetOrAdd метод, который соединит таблицу с моими данными, если она существует, и если она не существует, добавьте ее в базу данных, так что в большинстве случаев она будет иметь только 1 вызов в базу данных вместо всегда 3 вызова

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018
using (var context = new BloggingContext())
{
   var blog = new Blog {Id = 1, Url = "blablabla" };
   context.Blogs.Update(blog);
   await context.SaveChangesAsync();
}

Если достижимому объекту задано значение первичного ключа, то он будет отслеживаться в состоянии Microsoft.EntityFrameworkCore.EntityState.Modified .Если значение первичного ключа не установлено, оно будет отслеживаться в состоянии Microsoft.EntityFrameworkCore.EntityState.Add .

Этот комментарий относится к методу обновления Entity Framework Core.Вам просто нужно вызвать метод Update, если сущность существует в базе данных, она будет обновлена, иначе будет создана как новая запись.

0 голосов
/ 28 ноября 2018

Пожалуйста, прочитайте следующее Документ

Вот шаблон "Вставить или обновить":

public void InsertOrUpdate(Blog blog)
{
    using (var context = new BloggingContext())
    {
        context.Entry(blog).State = blog.BlogId == 0 ?
                                   EntityState.Added :
                                   EntityState.Modified;

        context.SaveChanges();
    }
}

Обратите внимание, как только вы нажмете SaveChanges(), вы можетеожидайте, что ваш объект в памяти (blog, в данном случае) будет тем же объектом, который хранится в базе данных, и не должен был бы делать 3-ий вызов, чтобы получить его снова.EF Core обновит Primary Key фактическим постоянным идентификатором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...