Pregunta

Estoy intentando agregar una propiedad personalizada que es una guía, pero me da este error:

  

System.InvalidCastException: no se pudo   convertir el valor del parámetro de una cadena   a un guid. --- >   System.InvalidCastException: no válido   Reparto desde 'System.String' a   'System.Guid'.

Especifico esto en la configuración:

<parameter>
<parameterName value="@id" />
<dbType value="Guid" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%X{id}" />
</layout>
</parameter>

El código real (fragmento) que utilizo es este:

        Guid guid = Guid.NewGuid();
        if (defaultLogger.IsEnabledFor(level))
        {
            var loggingEvent = new LoggingEvent(ThisDeclaringType,
 defaultLogger.Repository, defaultLogger.Name, level, message, exception);
            loggingEvent.Properties["Id"] = guid;

¿Alguna ayuda por favor? :) El campo de identificación en la base de datos se define como un identificador único NO NULO, pero no tiene la clave principal primaria.

¿Fue útil?

Solución

Para su ejemplo, lo siguiente debería funcionar:

<parameter>
<parameterName value="@Oid" />
<dbType value="Guid" />
<layout type="log4net.Layout.RawPropertyLayout">
<key value="Id" />
</layout>
</parameter>

Importante es que cambias el nombre de @id a otra cosa, de lo contrario obtendrás valores nulos en la base de datos incluso si intentas insertar cadenas,

Y luego use RawPropertyLayout para almacenar, ya que no necesita hacer una conversión.

Otros consejos

1. Descargue el código fuente de log4.net

2. Cambie la función FormatValue dentro del archivo log4net.Appender.AdoNetAppender.cs de esta manera:

virtual public void FormatValue(IDbCommand command, LoggingEvent loggingEvent)
        {
            // Lookup the parameter
            IDbDataParameter param = (IDbDataParameter)command.Parameters[m_parameterName];

            // Format the value
            object formattedValue = Layout.Format(loggingEvent);

            // If the value is null then convert to a DBNull
            if (formattedValue == null)
            {
                formattedValue = DBNull.Value;
            }

            if (param.DbType == System.Data.DbType.Guid)
            {
                param.Value = new Guid(formattedValue.ToString());
            }
            else
            {
                param.Value = formattedValue;
            }
        }

entonces funciona!

Si desea obtener una propiedad GUID de propósito general, puede hacer lo siguiente:

    private void ConfigureLog4Net()
    {
        // adds a global custom log4net property
        log4net.GlobalContext.Properties[nameof(Guid.NewGuid)] = new NewGuidWrapper();

        // configures log4net by XML configurations from a .config file
        log4net.Config.XmlConfigurator.Configure();
    }

    private class NewGuidWrapper
    {
        // will return new GUID every time it's called
        public override string ToString() => Guid.NewGuid().ToString();
    }

y luego puede llamar a la propiedad de la siguiente manera:

<layout type="log4net.Layout.PatternLayout">
  <!-- if you want to format the layout as a GUID followed by a message  -->
  <conversionPattern value="%property{NewGuid} %m%n" />
</layout>

También puede usar este tipo de diseño para un parámetro de base de datos personalizado como se describe aquí .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top