在 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 中,附加方法不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP.NET Core 中使用 DbContext 注入并行 EF Core 查询
在 EF Core DbContext 中,附加方法不起作用
将 EF Core 搭建到现有 DbContext 的脚手架