我正在使用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; }
}
然后在服务方法中,我仅修改Entity的某些属性
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;
答案 0 :(得分:0)
当您有一个完整的实体实例但未被跟踪时,将使用Attach方法。附加实体后,将对其进行跟踪,并且EF Core假定其内容与当前数据库状态匹配。它提供了此功能,而无需从数据库中加载它。 Attach方法通过将实体的状态设置为未更改来实现此目的。因此,您的呼叫
_dbContext.SaveChanges();
不执行任何查询,因为任何实体都没有更改。
您可以使用其他功能
var entity = new MyEntity();
context.Update(entity);