web-dev-qa-db-ja.com

エンティティフレームワークコアを使用してレコードを更新する方法は?

エンティティフレームワークコアのデータベーステーブルデータを更新する最良の方法は何ですか?

  1. テーブル行を取得し、変更を加えて保存します
  2. キーワード更新をデータベースコンテキストで使用し、存在しないアイテムの例外を処理する

EF6で使用できる改善された機能は何ですか?

41
Charith

Entity Framework Coreでエンティティを更新するための論理プロセスは次のとおりです。

  1. DbContextクラスのインスタンスを作成します
  2. キーでエンティティを取得
  3. エンティティのプロパティを変更します
  4. 変更内容を保存

DbContextUpdate()メソッド:

SaveChanges()が呼び出されたときにデータベースで更新されるように、Modified状態の特定のエンティティの追跡を開始します。

更新メソッドは、変更をデータベースに保存しません。代わりに、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's edition";

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

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

これが役立つかどうか教えてください

48
H. Herzl

Microsoft docs によると:

先読みアプローチでは、追加のデータベース読み取りが必要であり、同時実行の競合を処理するためのより複雑なコードになる可能性があります

ただし、DbContextでUpdateメソッドを使用すると、すべてのフィールドがmodifiedとしてマークされ、それらすべてがクエリに含まれることに注意してください。フィールドのサブセットを更新する場合は、Attachメソッドを使用し、目的のフィールドをmodifiedとして手動でマークする必要があります。

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

Microsoft Docs は2つのアプローチを提供します。

推奨HttpPost編集コード:読み取りと更新

これは、以前のバージョンのEntity Frameworkで使用していたのと同じ古い方法です。これがMicrosoftが推奨していることです。

長所

  • 防止 オーバーポスト
  • EFの自動変更追跡は、フォーム入力によって変更されるフィールドにModifiedフラグを設定します。

AlternativeHttpPost編集コード:作成および添付

別の方法は、モデルバインダーによって作成されたエンティティをEFコンテキストに添付し、それを変更済みとしてマークすることです。

他の回答で述べたように、先読みアプローチでは追加のデータベースの読み取りが必要であり、同時実行の競合を処理するためのより複雑なコードになる可能性があります。

3
Nipuna