Альтернативный ответ, который не требует Automapper для преобразования DTO в Entity, использует DbEntry:
var oldEntity = DbSet.FirstOrDefault(x => x.Id == updatedEntity.Id);
var oldEntry = Context.Entry(oldEntity);
oldEntry.CurrentValues.SetValues(updatedEntity);
Вам не нужно проверять наличие / состояние, потому что вы получаете старую сущность сначала, так что к нему привязано отслеживание изменений. Кроме того, CurrentValues.SetValues могут принимать разные типы, в этом примере updatedEntity является DTO. Документация по значениям значений объясняется следующим образом:
Устанавливает значения этого словаря, считывая значения из заданного объекта. Данный объект может быть любого типа. Любое свойство объекта с именем, которое соответствует имени свойства в словаре и может быть прочитано, будет считано. Другие свойства будут проигнорированы. Это позволяет, например, копировать свойства из простых объектов передачи данных (DTO).
blockquote>Похоже, что он уже может работать в режиме autapper-esque.
Вы должны использовать фактический 0 (или другой макрос). Расширение макроса обрабатывается препроцессором C во время компиляции. Он ничего не знает о значениях переменных во время выполнения.
Как уже говорилось, расширение макроса выполняется во время компиляции, поэтому имя функции не будет известно во время выполнения.
Более целесообразно использовать указатели на функции и массив для них.
Пример:
typedef int (*TFoo)(int);
int foo1(int x)
{
printf("from foo1: x = %d\n", x);
return 0;
}
int foo2(int x)
{
printf("from foo2: x = %d\n", x);
return 0;
}
TFoo foos[2] = {foo1, foo2};
#define foo(i, x) foos[i](x)
Вот и все. Надеюсь, это поможет
Предварительная обработка 'c' - это процесс замены макросов текстом из их определений. некоторые операции, такие как ##, позволяют добавлять свой аргумент в виде текста в определения. Итак, все сделано еще до начала компиляции.
В результате в вашем случае FUN(fun,i)
будет подставлено в виде текста и формы funi
. Единственный ограниченный способ создания имен функций, которые вы хотите, - это использовать реальные текстовые значения или другие макросы. Вот 2 примера, которые будут работать с предварительной обработкой:
FUN(fun, 0)(1);
или
#define I 0
FUN(fun, I)(1);
В последнем случае I
является самим макросом, поэтому он также работает. (всегда полезно называть имя макроса заглавными буквами).