2017-12-14 5 views
0

式からエンティティを更新するにはどうすればよいですか?式からエンティティを更新する(EF Core 2.0)

私は、更新するプロパティ(列)を動的に構築します。それを行う関数は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に固執したい(私はSaveChangesDbUserを必要と私は別の要求を送信しないようにしたいです)。

更新日:
エンティティオブジェクトと式があります。さて、式に基づいてエンティティオブジェクトを編集し、エンティティを更新するSaveChangesを呼び出す必要があります。

+1

奨励金はお答えできません。あなたが達成しようとしていることは絶対に不明です。あなたは、あなたがコメントに参照しようとしていることを示すことから始めることができます。 –

+0

私は問題の追加情報を追加します。私は追加の説明と私のコードは、私が達成しようとしているものを説明すると信じています。 – Makla

+1

あなたが話している表現が、[オブジェクトから式を作成](https://stackoverflow.com/questions/47468652/build-expression-from-object)という一般的な表現で、あなたがこの質問から来ている場合は、一般的には '式> '、それは*更新*のために絶対に不適切です。更新のために 'new {...}'( 'Expression.MemberInit')を使わない' Expression 'が必要ですが、代入のブロックです。現在策定されている方法では、この質問は意味をなさない。 –

答えて

2

あなたが探している魔法のライン:

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

しかし、その後entityDbUserだから、これは私には意味がありません 、タイプTのインスタンスである必要はありません。 Tが定義されているメソッドのシグネチャが表示されないので、コンパイルするコードを正確に記述することはできません。また、this.CallVirtualMethodAndGetExpression(ModelFromRequest)のメソッドシグネチャがどのようなものかわかりません。

しかし、あなたはそれに渡すTの有効なインスタンスを持っている場合Compile()Func<T,T>のためのどのことができ、その後Invoke定義された機能だけFunc<T,T>Expression<Func<T,T>>を変更します。それはあなたがおそらくあなたのメソッドシグネチャを変更したり、一般的な方法か何かであなたのDBUSERを取得する必要があるとしているタイプDbUserであるため

は、今すぐあなたのentityは、タイプTのではありません。 DbUserインスタンスを渡す必要がある場合は、C#Genericsは必要ありません。カントは実際に利用可能な最新の情報で本当に伝えます。

関連する問題