Dot-Net

在 log4net 中使用 uniqueidentifiers/guids 作為自定義屬性

  • November 6, 2018

我正在嘗試添加一個自定義屬性,它是一個 guid,但它給了我這個錯誤:

System.InvalidCastException:無法將參數值從字元串轉換為 Guid。—> System.InvalidCastException:從“System.String”到“System.Guid”的無效轉換。

我在配置中指定:

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

我使用的實際程式碼(片段)是這樣的:

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

請問有什麼幫助嗎?:) 數據庫中的 id 欄位被定義為唯一標識符 NOT NULL,但它沒有主鍵約束。

對於您的範例,以下內容應該有效:

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

重要的是您將@id 重命名為其他名稱,否則即使您嘗試插入字元串,您也會在數據庫中獲得 Null 值,

然後使用 RawPropertyLayout 來儲存,因為你不需要做轉換。

**1.**下載log4.net原始碼

2.FormatValue像這樣改變文件裡面的函式log4net.Appender.AdoNetAppender.cs

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;
           }
       }

那麼它的工作原理!

引用自:https://stackoverflow.com/questions/424018