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

问题描述 投票:0回答:1

如何从表达式更新实体?

我动态构建应更新哪些属性(列)。这样做的函数返回Expression<Func<T, T>>,其中Tentity。 我使用WhereSingle从数据库加载实体。

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.

我知道我可以使用EF Plus(批量更新),但我想坚持使用SaveChanges(在DbUser后我需要SaveChanges,我想避免发送另一个请求)。

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

entity-framework entity-framework-core
1个回答
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定义的功能。

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

© www.soinside.com 2019 - 2024. All rights reserved.