Пользовательские целевые свойства базы данных не сохранятся - PullRequest
0 голосов
/ 12 февраля 2020

Итак, мое решение. NET на самом деле имеет 2 разных проекта, один для уровня доступа к данным и другой для основного проекта. Мне интересно, почему мои ценности не переносятся между проектами или что-то в этом роде. Я добавил конфигурацию NLog в файл Global.asax.cs в моем основном проекте:

var config = new LoggingConfiguration();
// Add another NLog Target (ChangeTracking)
var changeTrackingDbTarget = new DatabaseTarget()
{
    Name = "ChangeTracking",
    ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["NLogConnection"].ConnectionString,
    CommandText = "INSERT INTO Common.ChangeTracking ( ApplicationID,  UserName,  Name,  EntityName,  PropertyName,  PrimaryKeyValue,  OldValue,  NewValue, DateChanged) " +
                  "VALUES (@ApplicationID, @UserName, @Name, @EntityName, @PropertyName, @PrimaryKeyValue, @OldValue, @NewValue, @DateChanged);"
};

changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@ApplicationID", Layout = "${appsetting:name=AppID:default=null}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@UserName", Layout = "${identity:authType=false:isAuthenticated=false}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@Name", Layout = "${gdc:item=name}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@EntityName", Layout = "${gdc:item=entityname}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@PropertyName", Layout = "${gdc:item=propname}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@PrimaryKeyValue", Layout = "${gdc:item=primarykey}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@OldValue", Layout = "${event-properties:item=oldvalue}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@NewValue", Layout = "${event-properties:item=newvalue}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@DateChanged", Layout = "${date}" });

config.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, changeTrackingDbTarget));

//LogManager.Configuration.AddTarget("ExceptionTracking", dbTarget);
LogManager.Configuration = config;
LogManager.Configuration.AddTarget("ChangeTracking", changeTrackingDbTarget);

Как вы можете видеть, я пытался использовать свойства события и gd c, но ни один из них не получил параметры, которые я пытаюсь отправить. Однако ApplicationID, Username и DateChanged устанавливаются (и отлично сохраняются в таблице Common.ChangeTracking) просто отлично, потому что они не являются пользовательскими свойствами.

Класс, содержащий код, который фактически пытается регистрировать изменения при сохранении находится в root моего проекта уровня доступа к данным (похоже, не работает ни GD C, ни EventInfo):

private static Logger _logger = LogManager.GetLogger("ChangeTracking");
//private static Logger _logger = LogManager.GetCurrentClassLogger();

LogEventInfo changeEvent = new LogEventInfo(LogLevel.Info, "ChangeTracking", "A change event has been fired");
GlobalDiagnosticsContext.Set("Name", "Jake");
changeEvent.Properties["EntityName"] = "test";
changeEvent.Properties["PropertyName"] = "test property name";
changeEvent.Properties["PrimaryKeyValue"] = 123;
changeEvent.Properties["OldValue"] = "test";
changeEvent.Properties["NewValue"] = "test";
_logger.Log(changeEvent);

1 Ответ

1 голос
/ 12 февраля 2020

Я понял свою ошибку. Я неправильно задал первый параметр:

GlobalDiagnosticsContext.Set("Name", "Jake");

В следующей строке он должен соответствовать {gdc:NAME}, а не @Name:

changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@Name", Layout = "${gdc:NAME}" });

Установка этого значения исправляет выпуск:

GlobalDiagnosticsContext.Set("NAME", "Jake");
...