既存の切断されたエンティティを更新する方法

entity-framework-core

質問

私はEntityFrameworkCoreで動作するこのコードを持っています。

public void SaveProject(Project item)
    {
        var existing = _context.Projects.FirstOrDefault(a => a.Id == item.Id);
        existing.Description = item.Description;
        existing.IsArchived = item.IsArchived;
        existing.IsDeleted = item.IsDeleted;
        existing.Name = item.Name;
        _context.SaveChanges();

    }

切断されたエンティティを取得し、データベース内でそのエンティティを見つけ、変更を適用します。

これを行うより良い方法はありますか?

私はデータベースへの呼び出しをしません。つまり、私はエンティティを変更済みとしてマークし、SaveChanges()を呼び出せるようにしたいと思います。

それを行う方法はありますか?

受け入れられた回答

アイテムがデータベースに存在することが確かな場合は、DbContextのAttachメソッドを使用できます。

public void SaveProject(Project item)
{
    _context.Projects.Attach(item);
    _context.Entity(item).State=EntityState.Modified;
    _context.SaveChanges();
}

人気のある回答

EntityFramework Coreでは、Updateメソッドを使用してこれを行うことができます:

 DbContext.Update<Item>(item);
 this.SaveChanges();

バージョン2.1では、Idプロパティが自動生成された場合、Updateメソッドを新しいエンティティと既存のエンティティの両方で使用できるようになりました。

ドキュメント

これの欠点は、たとえ同じであっても、 すべてのプロパティが変更済みとしてマークされていることです。この問題は、データベース・トリガーに変更を記録すると、変更されていない場合でも、すべてのプロパティに変更が加えられたというフラグが立てられます。特定のプロパティのみを更新する場合は、データベースからエンティティを取得し、必要に応じて更新してから保存する必要があります。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ