从表达式更新实体(EF Core 2.0)

时间:2017-12-14 16:25:30

标签: entity-framework entity-framework-core

如何从表达式更新实体?

我动态构建应更新哪些属性(列)。执行此操作的函数将返回child_list[1] Expression<Func<T, T>>T的位置 我使用entityWhere从数据库加载了实体。

Single

我知道我可以使用EF Plus(批量更新),但我想坚持Expression<Func<T, T>> expr = this.CallVirtualMethodAndGetExpression(ModelFromRequest); DbUser entity = this.context.Users.Where(t => t.Id == 1).Single(); some magic ??? //tried expr.Compile()(entity) but it does not work. this.context.SaveChanges(); //use DbUser with updated properties of course. SaveChanges之后我需要DbUser我想避免发送另一个请求)。

更新
我有实体对象和表达式。现在,我需要根据表达式编辑实体对象,并调用SaveChanges来更新实体。

1 个答案:

答案 0 :(得分:2)

你正在寻找的魔术线​​:

var resultOfTypeT = expr.Compile().Invoke(entity)

但是entity需要是T类型的实例,而不是DbUser 所以这对我没有意义。 所以我无法给你准确的代码为你编译,因为我无法看到定义T的方法签名。并且还不知道this.CallVirtualMethodAndGetExpression(ModelFromRequest)的方法签名是什么样的。

Compile()会将Expression<Func<T,T>>更改为Func<T,T>,如果您拥有Invoke的有效实例,那么可以Func<T,T>定义T的功能{1}}传递给它。

现在您的entity不属于T类型,因为它的类型为DbUser所以您可能需要更改方法签名或以通用方式获取DbUser或者其他的东西。如果您只需要传递DbUser实例,则不需要c#Generics。但不能仅仅掌握当前可用的信息。