.NET-将所有实体电流值设置为新值,而无需指定单独的属性



我有两个实体,一个是数据库中的一个实体,另一个是我从控制器中收到的新值。

现在,我想在数据库中更新数据库中的实体,而无需指定所有不同的属性;

而不是:

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()

时告诉EF Tracker更新其所有字段

示例代码看起来像这样。

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()
}

最新更新