代码之家  ›  专栏  ›  技术社区  ›  Giova

如何在复盆子pi 2(Mono 4+ARM proc)上部署npgsql?

  •  1
  • Giova  · 技术社区  · 9 年前

    我使用Visual studio 2013(Windows)使用Npgsql和Entity Framework 6构建了一个小型.NET 4.5应用程序。

    在窗户上,它工作得很好。 但在Raspbian上,应用程序崩溃,表示找不到npgsql提供程序。

       Unhandled Exception:
    System.Configuration.ConfigurationErrorsException: Failed to find or load the registered .Net Framework Data Provider 'Npgsql'.
      at System.Data.Common.DbProviderFactories.GetFactory (System.String providerInvariantName) [0x00000] in <filename unknown>:0
    [...]
    

    在我的树莓皮2。

    我已经手动安装了Mono v4.0.2

    我复制了我的应用程序,包括:

    npgsql。dll v2.2.5.0

    npgsql。entityframework相同版本

    单声道。安全v4.0.2

    和我的应用程序。配置包含:

      <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
        <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
      </configSections>
      <entityFramework>
        <providers>
                <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" />
        </providers>
      </entityFramework>
      <connectionStrings>
        <add name="minitestEntities" connectionString="metadata=res://*/Model2.csdl|res://*/Model2.ssdl|res://*/Model2.msl;provider=Npgsql;provider connection string=&quot;PORT=5432;TIMEOUT=15;POOLING=True;MINPOOLSIZE=1;MAXPOOLSIZE=20;COMMANDTIMEOUT=20;COMPATIBLE=2.2.5.0;DATABASE=minitest;HOST=10.0.0.1;INTEGRATED SECURITY=True;PASSWORD=azerty;USER ID=theuser&quot;" providerName="System.Data.EntityClient" />
      </connectionStrings>
    </configuration>
    

    所以我想知道npgsql库是否正确加载,或者是否缺少引用。

    我没有找到关于如何在最近的mono+ARM环境中使用npgsql的文档。 如有任何有关此的信息,我们将不胜感激。

    1 回复  |  直到 9 年前
        1
  •  0
  •   Giova    9 年前

    好的,我在另一篇论文中找到了解决方案。与此同时,我忘记记下它的URL,所以这里的答案是:

    我们必须手动将提供者描述添加到应用程序中。配置:

    <system.data>
      <DbProviderFactories>
        <add name="Npgsql Data Provider" 
             invariant="Npgsql" 
             support="FF" 
             description=".Net Framework Data Provider for Postgresql Server" 
             type="Npgsql.NpgsqlFactory, Npgsql, Version=2.2.5.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" />
      </DbProviderFactories>
    </system.data>
    

    版本和PuclicKeyToken必须与npgsql.dll匹配。 要获取公钥令牌,可以运行以下代码:

    typeof(Npgsql.NpgsqlFactory).AssemblyQualifiedName
    

    现在我不知道为什么这一步在windows中不是必须的,但在linux中是必须的。。。