【问题标题】:Update entity from expression (EF Core 2.0)从表达式更新实体 (EF Core 2.0)
【发布时间】:2017-12-18 17:02:36
【问题描述】:

如何从表达式更新实体?

我动态构建应该更新哪些属性(列)。执行此操作的函数返回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(我需要在SaveChanges 之后使用DbUser,并且我想避免发送另一个请求)。

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

【问题讨论】:

  • 赏金不会让问题变得可以回答。绝对不清楚您要达到的目标。您可以先在评论中显示您提到的尝试。
  • 我添加了有问题的附加信息。我相信我的代码和额外的解释解释了我想要实现的目标。
  • 如果你所说的表达是来自你Build expression from object的这个问题,一般是Expression&lt;Func&lt;T, T&gt;&gt;,那么它绝对不适合更新。对于更新,您需要Expression&lt;Action&lt;T, T&gt;&gt;,它不使用new { ... } (Expression.MemberInit),而是使用分配块。目前的表述方式,这个问题没有任何意义。
  • 更新后:嗯,那里的新信息为零。也许您应该说明为什么仅在 User 对象中设置值是不够的。我认为创建表达式至少需要相同数量的代码。

标签: entity-framework entity-framework-core


【解决方案1】:

你正在寻找的魔法线:

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

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

Compile() 会将Expression&lt;Func&lt;T,T&gt;&gt; 更改为仅Func&lt;T,T&gt;,如果您有T 的有效实例传递给它,那么Invoke 可以为Func&lt;T,T&gt; 定义功能。

现在您的entity 不是T 类型,因为它是DbUser 类型所以您可能需要更改您的方法签名或以通用方式或其他方式获取您的DbUser。如果您只需要传递 DbUser 实例,则不需要 c# 泛型。但仅凭可用的当前信息无法真正判断。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2018-12-05
    • 2019-01-26
    相关资源
    最近更新 更多