在 EF Core DbContext 中,附加方法不起作用

Posted

技术标签:

【中文标题】在 EF Core DbContext 中,附加方法不起作用【英文标题】:In EF Core DbContext the attach method is not working 【发布时间】:2019-10-22 11:41:47 【问题描述】:

我正在使用EF Core 2.2.4我有以下实体

public partial class Person: IBaseEntity

    [Key]
    public int PersonID get; set; 
    public string FirstName  get; set; 
    public string LastName  get; set; 
    public string Address  get; set; 
    public DateTime CreatedDateTime  get; set; 
    public DateTime ModifiedDateTime  get; set; 
    public byte[] VersionStamp  get; set; 

然后在服务方法中我只修改实体的某些属性

 public async Tak Update()
 
    var p= new Person();
    task.FirstName = "Foo";

   _dbContext.Attach<Person>(p);
   _dbContext.SaveChanges();
 

如果我没记错的话,当没有跟踪实体并且您只想更改某些属性时使用 Attach 方法。

但是,上面的代码什么也没做。当我运行 SqlProfiler 时,我没有看到在 SaveChanges() 上执行任何 sql

我是否需要明确告诉 EF 属性已被修改?类似的东西

_dbContext.Entry<Person>(p).Property(p => p.FirstName).IsModified = true;

【问题讨论】:

您需要有ID值才能使用实体框架核心对数据库进行任何更改,请检查:***.com/questions/46657813/… 【参考方案1】:

当你有一个完整的实体实例但它没有被跟踪时,使用 Attach 方法。附加实体后,将对其进行跟踪,并且 EF Core 假定其内容与当前数据库状态匹配。它提供了这一点,而无需从数据库中加载它。 Attach 方法通过将实体的 State 设置为 Unchanged 来实现这一点。所以您的调用

_dbContext.SaveChanges();

不要执行任何查询,因为任何实体都没有变化。

你可以使用其他功能

var entity = new MyEntity();
context.Update(entity);

【讨论】:

以上是关于在 EF Core DbContext 中,附加方法不起作用的主要内容,如果未能解决你的问题,请参考以下文章

EF Core Scaffold DbContext

在 ASP.NET Core 中使用 DbContext 注入并行 EF Core 查询

在 EF Core DbContext 中,附加方法不起作用

将 EF Core 搭建到现有 DbContext 的脚手架

在单元测试期间避免在EF Core 2.2中使用HasData Seed DbContext

EF Core 中DbContext不会跟踪聚合方法和Join方法返回的结果