Как обновить запись, используя ядро сущности?

Каков наилучший подход к обновлению данных таблицы базы данных в ядре базы данных сущности?

  1. Извлеките строку таблицы, внесите изменения и сохраните
  2. Использовать ключевое слово Обновление в контексте db и исключение обработки для элемента не существует

Какова улучшенная функция, которую мы можем использовать над EF6?

Ответ 1

Чтобы обновить сущность с помощью Entity Framework Core, это логический процесс:

  1. Создать экземпляр для класса DbContext
  2. Получить объект по ключу
  3. Внести изменения в свойствах объекта
  4. Сохранить изменения

Метод Update() в DbContext:

Начинает отслеживать заданную сущность в измененном состоянии, так что она будет обновляться в базе данных при SaveChanges().

Метод обновления не сохраняет изменения в базе данных; вместо этого он устанавливает состояния для записей в экземпляре DbContext.

Итак, мы можем вызвать метод Update() перед тем, как сохранить изменения в базе данных.

Я возьму некоторые определения объектов, чтобы ответить на ваш вопрос:

  1. База данных называется Store

  2. Название таблицы - Продукт

Определение класса продукта:

public class Product
{
    public int? ProductID { get; set; }

    public string ProductName { get; set; }

    public string Description { get; set; }

    public decimal? UnitPrice { get; set; }
}

Определение класса DbContext:

public class StoreDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Your Connection String");

        base.OnConfiguring(optionsBuilder);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Order>(entity =>
        {
            // Set key for entity
            entity.HasKey(p => p.ProductID);
        });

        base.OnModelCreating(modelBuilder);
    }
}

Логика для обновления сущности:

using (var context = new StoreDbContext())
{
        // Retrieve entity by id
        // Answer for question #1
        var entity = context.Products.FirstOrDefault(item => item.ProductID == id);

        // Validate entity is not null
        if (entity != null)
        {
            // Answer for question #2

            // Make changes on entity
            entity.UnitPrice = 49.99m;
            entity.Description = "Collector edition";

            // Update entity in DbSet
            context.Products.Update(entity);

            // Save changes in database
            context.SaveChanges();
        }
}

Пожалуйста, дайте мне знать, если это полезно

Ответ 2

Согласно документам Microsoft:

Подход для чтения требует дополнительного чтения из базы данных и может привести к более сложному коду для обработки конфликта параллелизма

Однако вы должны знать, что использование метода Update в DbContext пометит все поля как измененные и включит их все в запрос. Если вы хотите обновить подмножество полей, вы должны использовать метод Attach, а затем пометить нужное поле как измененное вручную.

context.Attach(person);
context.Entry(person).Property("Name").IsModified = true;
context.SaveChanges();

Ответ 3

Microsoft Docs дает нам два подхода.

Рекомендуемый HttpPost Редактировать код: чтение и обновление

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

преимущества

  • Предотвращает перепост
  • Автоматическое отслеживание изменений EFs устанавливает флажок Modified для полей, которые изменяются при вводе формы.

Альтернативный HttpPost Редактировать код: Создать и прикрепить

альтернатива - присоединить объект, созданный связывателем модели, к контексту EF и пометить его как измененный.

Как упомянуто в другом ответе, метод чтения в первую очередь требует дополнительного чтения из базы данных и может привести к более сложному коду для обработки конфликтов параллелизма.