如何更新現有的斷開實體

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
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow