Что я хочу: функция для записи изменений после модификации
В моем приложении люди могут изменять данные, и я хочу записать, какие данные изменены
Что я пробовал: Generi c
Я использую ABP, и мне нужно сравнить сущность (старые данные) и InputDto (новые данные), поэтому я написал функцию преобразовать сущность или dto в словарь, а затем я сравниваю различия между двумя словарями, чтобы получить изменения.
Это моя функция преобразования:
public static Dictionary<string, string> ConverModelToDict<T>(T model)
{
Type t = model.GetType();
PropertyInfo[] propertyList = t.GetProperties();
Dictionary<string, string> result = new Dictionary<string, string>();
foreach (PropertyInfo item in propertyList)
{
string name = item.Name;
if (item.GetValue(model) != null)
{
object value = item.GetValue(model);
result.Add(name, value.ToString());
}
}
return result;
}
Я написал другой функция для получения объекта и dto для сравнения:
public async Task<string> CompareEntityAndDto<T, K>(T oldModel, K newModel, string moduleName)
{
var oldDict = ConverModelToDict(oldModel);
var newDict = ConverModelToDict(newModel);
string result = "";
foreach (var key in newDict.Keys)
{
if (oldDict.ContainsKey(key) && newDict[key] != oldDict[key])
{
var value = "【" + oldDict[key] + "】" + "changeTo" + "【" + newDict[key] + "】";
result += key + ":" + value + ";";
}
}
string detial = moduleName + result;
return detial;
}
oldModel
- это объект, который является результатом запроса к базе данных, newmodel
- это dto из данных формы, moduleName
- это просто строка, вот как я вызываю функцию в моем приложении
await _compareAppService.CompareEntityAndDto(query, input, "somestring");
и получаю ошибку:
System.NotImplementedException: IsValid (значение объекта) не было реализовано этот класс. Предпочтительной точкой входа является GetValidationResult (), и классы должны переопределять IsValid (значение объекта. Контекст ValidationContext). в System.ComponentModel.DataAnnotations.ValidationAttribute.IsValid (значение объекта. ValidationContext validationContext) в System.ComponentModel.DataAnnotations.ValidationAttribute.GetValidationResult (объектное значение. в D: \ Github \ aspnetboilerplate \ src \ Abp \ Runtime \ Validation \ Interception \ DataAnnotationsValidator.cs: строка 38 в Abp.Runtime.Validation.Interception.MethodInvocationValidator.SetValidationErrors (Объект validatingObject \ spject \ spject \ sbject) в: Abp \ Runtime \ Validation \ Interception \ MethodInvocationValidator.cs: строка 208 в Abp.Runtime.Validation.Interception.MethodInvocationValidator.ValidateObjectRecursively (объект validatingObject. Int32 currentDepth) в D: \ Github \ Interception \ Interp \ Intertime \ aspnet \ MethodInvocationValidator.cs: строка 168 в Abp.Runtime.Validation.Interception.MethodInvocation Validator.ValidateObjectRecursively (Объект validatingObject. Int32 currentDepth) в D: \ Github \ aspnetboilerplate \ src \ Abp \ Runtime \ Validation \ Interception \ MethodInvocationValidator.cs: строка 188 в Abp.Runtime.Validation.Interception.MethodInvocationValidator.Validate () в D \ sp \ Abp \ Runtime \ Validation \ Interception \ MethodInvocationValidator.cs: строка 82 в Abp.Runtime.Validation.Interception.ValidationInterceptor.Intercept (вызов IInvocation) в D: \ Github \ aspnetboilerplate \ src \ Abp \ Runtime \ Validation Validation 30 : строка 178 в lambda_method (Closure. Object) в Microsoft.AspNetCore. Mvc .Internal.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute (преобразователь IActionResultTypeMapper. ObjectMethodExecutor executor. Объектный контроллер. Объект [103]. аргументы в. Object. 4 * .Internal.ControllerActionInvoker.InvokeActionMethodAsyn c () в Microsoft.AspNetCore. Mvc .Internal.ControllerActionInvoker.InvokeNextActionFilterAsyn c () в контекстном действии Microsoft.AspNetCore. * 1038 в Microsoft.AspNetCore. Mvc .Internal.ControllerActionInvoker.Next (State & next. Область применения Объект и состояние. Boolean & isCompleted) в Microsoft.AspNetCore. Mvc .Internal.ControllerActionInvoker.InvokeInnerFilterAsyn c () в Microsoft.AspNetCore. Mvc .Internal.ResourceInvoker.InvokeNextExceptionFilterAsyn
(1030 *) (1030 *) Как я могу исправить эту ошибку, или есть другой способ решить мою проблему?