2009-01-08 14 views
7

Estoy tratando de agregar una propiedad personalizada que es un GUID, pero me da este error:Uso uniqueidentifiers/guids como propiedades personalizadas en log4net

System.InvalidCastException: Failed to convert parameter value from a String to a Guid. ---> System.InvalidCastException: Invalid cast from 'System.String' to 'System.Guid'.

especifico presente 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) yo uso es la siguiente:

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

Cualquier ayuda por favor? :) El campo id en la base de datos se define como identificador único NOT NULL, pero no tiene la restricción de la clave principal.

+0

¿por qué quieres una guía? ¿Esto es para proporcionar algún tipo de contexto? –

Respuesta

22

Para su ejemplo lo siguiente debe funcionar:

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

importante es cambiar el nombre de @id a otra cosa de lo contrario obtendrá valores nulos en la base de datos, incluso si se intenta insertar cadenas,

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

+1

Para mayor claridad, es el nombre del valor de búsqueda en la colección Propiedades de LoggingEvent. – bluedot

0

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

2. cambiar la función FormatValue dentro del archivo log4net.Appender.AdoNetAppender.cs así:

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!

Cuestiones relacionadas