2017-12-14 13 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) 

그러나 entity 필요 그래서이 나에게 이해가되지 않습니다하지 DbUser 입력 T의 인스턴스합니다. T이 정의 된 곳에서 메소드 서명을 볼 수 없으므로 컴파일 할 정확한 코드를 제공하지 않습니다. this.CallVirtualMethodAndGetExpression(ModelFromRequest)의 메서드 서명이 어떤 모양 인지도 모릅니다.

그러나 Compile()Expression<Func<T,T>> 그냥 Func<T,T> 다음 T의 유효한 인스턴스가 Func<T,T> 경우에 대해 정의 된 기능이 그것에 Invoke을 통과 할 수있는 변경됩니다. 그것은 그래서 당신은 아마 당신의 방법 서명을 변경하거나 일반적인 방법 또는 무언가에 dbuser에를 얻을 필요가가는 타입 DbUser이기 때문에

는 이제 entity는 입력 T이 아닌. DbUser 인스턴스 만 전달해야하는 경우 C# Generics가 필요하지 않습니다. 그러나 위선적 인 말은 실제로 이용할 수있는 현재의 정보만으로 말합니다.