nlog4.x $ {longdate}适用于Npgsql 2.2.7,但不适用于Npgsql 3.x

时间:2017-05-20 17:26:27

标签: c# postgresql entity-framework nlog

我使用NLog4.1版本进行日志记录。

我的“NLog.config”看起来像:

<target name="database" xsi:type="Database">
    <connectionStringName>PRODUCTION</connectionStringName>
    <commandText>
        INSERT INTO "MY"."LOG_TABLE" ( "ENTRY_DATE" ) VALUES ( @ENTRY_DATE );
    </commandText>

    <parameter name="@entry_date" layout="${longdate}"/>
</target>

当我使用Npgsql v2.2.7 Nuget包时,记录正常。

但是当Nuget包升级到Npgsql v3.2.2而EntityFramework6.Npgsql升级到v3.1.1时会出现错误:

protected static NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
Logger.Info("Logger started.");

以下错误:

  

42804:“ENTRY_DATE”列的时间戳类型没有时区但表达式的类型为text

     

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

     

异常详细信息:Npgsql.PostgresException:42804:列“ENTRY_DATE”的类型为timestamp,没有时区但表达式的类型为text

     

[PostgresException(0x80004005):42804:“ENTRY_DATE”列的类型为timestamp,没有时区但表达式的类型为text]

网络配置更改

for v2.2.7:

<system.data>
    <DbProviderFactories>
        <add name="Npgsql Data Provider" invariant="Npgsql" description="Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql" />
    </DbProviderFactories>
</system.data>
<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" />
    </providers>
</entityFramework>

for v3.2.2:

<system.data>
    <DbProviderFactories>
        <add name="Npgsql Data Provider" invariant="Npgsql" description="Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql" />
    </DbProviderFactories>
</system.data>
<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" />
    </providers>
</entityFramework>

Postgresql DB列定义:

 "ENTRY_DATE" timestamp without time zone

升级到v3.x后有什么变化?请帮助在v3.x上正确使用。

提前致谢。

1 个答案:

答案 0 :(得分:0)

NLog中数据库目标的参数是文本参数。

似乎Npgsql / PostgreSQL / EntityFramework6现在更加挑剔。

您需要将string转换为timestamp类型。您可以使用to_timestamp PostgreSQL函数在查询中执行此操作:

 <commandText>
    INSERT INTO "MY"."LOG_TABLE" ( "ENTRY_DATE" ) 
    VALUES (to_timestamp(@ENTRY_DATE,  'YYYY-MM-DD H24:MI:SS.MS');
 </commandText>

C#中的格式:yyyy-MM-dd HH:mm:ss.ffff,在PostgreSQL中:YYYY-MM-DD H24:MI:SS.MS - 请参阅PostgreSQL docs