2016-11-15 3 views
0

на засыпку (и расстраивает проблема) - - Npgsql возможно, вы, ребята, может быть достаточно умны, чтобы решить:Entity Framework 6 - ошибка соединения строка

Проблема

Я хочу, чтобы иметь возможность читать/пишите в мою базу данных с помощью Entity Frameworks. У меня есть простые рельсы приложений, работающие на Heroku (простой эшафот). Я хочу подключиться к этой базе данных и манипулировать записями. Хорошей новостью является то, что я могу успешно подключиться к этой базе данных с помощью npgsql. Плохая новость заключается в том, что я не могу это сделать с Entity Framework. Это ошибка, я получаю:

System.Data.Entity.Core.ProviderIncompatibleException: Ошибка произошла при получении информации о поставщике из базы данных. Этот может быть вызван платформой Entity Framework с использованием неправильного подключения строки . Проверьте внутренние исключения и убедитесь, что строка подключения верна. ---> System.Data.Entity.Core.ProviderIncompatibleException: провайдер не вернул строку ProviderManifestToken. ---> System.IO.FileLoadException: Не удалось загрузить файл или сборку 'Npgsql, Версия = 3.1.2.0, Culture = neutral, PublicKeyToken = 5d8b90d52f46fda7' или одна из его зависимостей. Определение манифеста локального узла не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Вот трассировки стека:

at Npgsql.NpgsqlServices.GetDbProviderManifestToken(DbConnection connection) 
    at System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(DbConnection connection) 
    --- End of inner exception stack trace --- 
    at System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(DbConnection connection) 
    at System.Data.Entity.Utilities.DbProviderServicesExtensions.GetProviderManifestTokenChecked(DbProviderServices providerServices, DbConnection connection) 
    --- End of inner exception stack trace --- 
    at System.Data.Entity.Utilities.DbProviderServicesExtensions.GetProviderManifestTokenChecked(DbProviderServices providerServices, DbConnection connection) 
    at System.Data.Entity.Infrastructure.DefaultManifestTokenResolver.<>c__DisplayClass1.<ResolveManifestToken>b__0(Tuple`3 k) 
    at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory) 
    at System.Data.Entity.Infrastructure.DefaultManifestTokenResolver.ResolveManifestToken(DbConnection connection) 
    at System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection connection, DbProviderManifest& providerManifest) 
    at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection) 
    at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext) 
    at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input) 
    at System.Data.Entity.Internal.LazyInternalContext.InitializeContext() 
    at System.Data.Entity.Internal.InternalContext.Initialize() 
    at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) 
    at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() 
    at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext() 
    at System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider() 
    at System.Linq.Queryable.Select[TSource,TResult](IQueryable`1 source, Expression`1 selector) 
    at ge_EntityFrameworkTest.Program.<Test>d__4.MoveNext() in c:\Users\Koshy\Documents\Visual Studio 2013\Projects\Practice\ge-EntityFrameworkTest\ge-EntityFrameworkTest\Program.cs:line 118 

Вот моя строка соединения:

NpgsqlConnectionStringBuilder sqlBuilder = new NpgsqlConnectionStringBuilder(); 
       sqlBuilder.Username = user; 
       sqlBuilder.Password = password; 
       sqlBuilder.Host = host; 
       sqlBuilder.Port = Int32.Parse(port); 
       sqlBuilder.Database = database; 
       sqlBuilder.Pooling = true; 
       sqlBuilder.UseSslStream = true;  
       sqlBuilder.SslMode = Npgsql.SslMode.Require; 
       sqlBuilder.TrustServerCertificate = true; 

Вот мой «Привет мир», что я используя для подключения и чтения из моей базы данных (из таблицы игроков). Он успешно печатает: «Лионель Месси» на консоли. Большой!

  #region connectingAndReadingDatabase 
      using (var conn = new NpgsqlConnection(sqlBuilder.ToString())) 
      { 
       conn.Open(); 
       using (var cmd = new NpgsqlCommand()) 
       { 
        cmd.Connection = conn; 

        // Retrieve all rows 
        cmd.CommandText = "SELECT * FROM players"; 
        using (var reader = cmd.ExecuteReader()) 
        { 
         while (reader.Read()) 
         { 
          Console.WriteLine(reader.GetString(1)); 
         } 
        } 
       } 
      } 
      #endregion 

Проблема в том, что я пытаюсь использовать Entity Frameworks. Это терпит неудачу с болезненной ошибкой. Я использую точно такую ​​же строку соединения, и не могу, чтобы жизнь меня работала там, где я ошибаюсь. Возможно, вы сможете легко определить проблему?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 
using System.Threading.Tasks; 
using System.Net.Http; 
using Newtonsoft.Json; 
using Npgsql; 
using System.Data.Entity; 
using System.Data.Common; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.ComponentModel.DataAnnotations; 
using System.Configuration; 
using System.Data.Entity.ModelConfiguration.Conventions; 


// Here is the code pertaining to my hello world entity framework example: 

     [Table("players", Schema = "public")] 
     public class Player 
     { 
      [Key] 
      [Column("id")] 
      public int id { get; set; } 
      [Column("name")] 
      public string Name { get; set; } 
      [Column("team")] 
      public string Team { get; set; } 
      public Player() { } 
     } 

     class NpgsqlConfiguration : System.Data.Entity.DbConfiguration 
     { 
      public NpgsqlConfiguration() 
      { 
       SetProviderServices ("Npgsql", Npgsql.NpgsqlServices.Instance); 
       SetProviderFactory ("Npgsql", Npgsql.NpgsqlFactory.Instance); 
       SetDefaultConnectionFactory (new Npgsql.NpgsqlConnectionFactory()); 
      } 
     } 

     [DbConfigurationType(typeof(NpgsqlConfiguration))] 
     public class PlayerContext : DbContext 
     {  
      public PlayerContext(DbConnection connection): base(connection, true) 
      {     
      } 

      public DbSet<Player> Players { get; set; } 
      protected override void OnModelCreating(DbModelBuilder modelBuilder) 
      { 

       modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
       //modelBuilder.Conventions.Add<CascadeDeleteAttributeConvention>(); 
       modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
       modelBuilder.HasDefaultSchema("public"); 
       base.OnModelCreating(modelBuilder); 
      }   
     } 

А вот мой app.config файл

<?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> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="v12.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
     <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" /> 
    </providers>  
    </entityFramework> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="Npgsql" publicKeyToken="5d8b90d52f46fda7" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.1.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
    <system.data> 
    <DbProviderFactories> 
     <add name="Npgsql Data Provider" 
      invariant="Npgsql" 
      description="Data Provider for PostgreSQL" 
      type="Npgsql.NpgsqlFactory, Npgsql" /> 
    </DbProviderFactories> 
    </system.data> 
    <connectionStrings> 
    <add name="PlayerContext" connectionString="Username=hjanadgkizjmgf;Password=password;Host=ec2-54-235-250-156.compute-1.amazonaws.com;Port=5432;Database=deek4ap6cf2a1;Pooling=true;Use SSL Stream=True;SSL Mode=Require;TrustServerCertificate=True;" providerName="Npgsql" /> 
    </connectionStrings> 
</configuration> 

Когда я прохожу в строке подключения непосредственно - то же самое один, который работал так хорошо, чтобы получить записи ранее, я получаю это любопытное исключение:

«Ключевое слово не поддерживается« имя пользователя »» - очевидно, ссылаясь на строку подключения .

using (var db = new PlayerContext(sqlBuilder.ToString())) 
       { // etc } 

Также любопытно, что я получил предупреждение перед компиляцией:

«Предупреждение 1 Найдено конфликты между разными версиями одного и того же зависимой сборки, которые не могут быть решены. Эти ссылки конфликты перечислены в журнале построения, когда подробные сведения о журналах установлены в . pg-EF-test2 «возможно, это что-то связано с Npgsql?

Любая помощь будет очень признательна.

ответ

6

Похоже, что пакет nuget "EntityFramework6.Npgsql" в текущей версии имеет неверно определенные зависимости. Он отображает «Npgsql (> = 3.1.0)» как зависимость, но на самом деле он требует Npgsql в версии 3.1.2 или выше.

Итак, исправление прост - просто обновите пакет Npgsql до последней версии. «Update-Package Npgsql» должен сделать трюк.

И что касается конструктора контекста со строковым параметром - вы получили странное исключение, потому что этот конструктор ожидает, что вы передадите имя строки подключения из вашего файла конфигурации. Вы должны использовать его следующим образом:

using (var db = new PlayerContext("PlayerContext")) 
{ } 
+0

Спасибо, наконец, нашли это после поиска ~ 1 дня, пытаясь исправить мою множественную настройку нескольких поставщиков, и на самом деле это была моя единственная проблема. (Обновление Npgsql с 3.1.0 до 3.2.6) –

Смежные вопросы