如何更新现有的断开实体

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合法吗? 是的,了解原因