エンティティフレームワークコアのデータベーステーブルデータを更新する最良の方法は何ですか?
EF6で使用できる改善された機能は何ですか?
Entity Framework Coreでエンティティを更新するための論理プロセスは次のとおりです。
DbContext
クラスのインスタンスを作成しますDbContext
のUpdate()
メソッド:
SaveChanges()
が呼び出されたときにデータベースで更新されるように、Modified状態の特定のエンティティの追跡を開始します。
更新メソッドは、変更をデータベースに保存しません。代わりに、DbContextインスタンスのエントリの状態を設定します。
そのため、データベースに変更を保存する前にUpdate()
メソッドを呼び出すことができます。
私はあなたの質問に答えるためにいくつかのオブジェクト定義を仮定します:
データベース名はStoreです
テーブル名は製品です
製品クラス定義:
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();
}
}
これが役立つかどうか教えてください
Microsoft docs によると:
先読みアプローチでは、追加のデータベース読み取りが必要であり、同時実行の競合を処理するためのより複雑なコードになる可能性があります
ただし、DbContextでUpdateメソッドを使用すると、すべてのフィールドがmodifiedとしてマークされ、それらすべてがクエリに含まれることに注意してください。フィールドのサブセットを更新する場合は、Attachメソッドを使用し、目的のフィールドをmodifiedとして手動でマークする必要があります。
context.Attach(person);
context.Entry(person).Property("Name").IsModified = true;
context.SaveChanges();
Microsoft Docs は2つのアプローチを提供します。
推奨HttpPost編集コード:読み取りと更新
これは、以前のバージョンのEntity Frameworkで使用していたのと同じ古い方法です。これがMicrosoftが推奨していることです。
長所
Modified
フラグを設定します。AlternativeHttpPost編集コード:作成および添付
別の方法は、モデルバインダーによって作成されたエンティティをEFコンテキストに添付し、それを変更済みとしてマークすることです。
他の回答で述べたように、先読みアプローチでは追加のデータベースの読み取りが必要であり、同時実行の競合を処理するためのより複雑なコードになる可能性があります。