我有两个实体,一个是数据库中的一个实体,另一个是我从控制器中收到的新值。
现在,我想在数据库中更新数据库中的实体,而无需指定所有不同的属性;
而不是:
public async Task UpdateFoo(Foo fooNew){
Foo fooDb = await context.Foo
.Include(f => f.Child)
.Where(f => f.Id == 1)
.FirstOrDefaultAsync();
fooDb.Value01 = fooNew.Value01;
fooDb.Value02 = fooNew.Value02;
fooDb.Child.ValueA = fooNew.Child.ValueA;
context.SaveChangesAsync()
}
我想做类似;
的事情public async Task UpdateFoo(Foo fooNew){
Foo fooDb = await context.Foo
.Include(f => f.Child)
.Where(f => f.Id == 1)
.FirstOrDefaultAsync();
fooDb = fooNew;
context.SaveChangesAsync()
}
我尝试使用CurrentValues.setValues;
context.Entry(fooDb).CurrentValues.SetValues(fooNew);
这会导致错误,因为键被标记为修改;
实体类型'foo'的属性'id'是密钥的一部分,因此不能 修改或标记为修改。
是否有一种方法可以覆盖和保存所有实体属性(和实体属性(,而无需一个一个人指定?
您从将模型附加到DbSet<T>
开始,然后告诉EF Tracker在调用.SaveChanges()
示例代码看起来像这样。
public async Task UpdateFoo(Foo foo_updated)
{
foo_updated = context.Set<Foo>()
.Attach(foo_updated);
context.Entry(foo_updated).State = EntityState.Modified;
context.Entry(foo_updated.Child).State = EntityState.Modified;
context.SaveChangesAsync()
}