0

Я пытаюсь подключиться к базе данных PostgreSQL с моего сайта ASP.NET MVC. Формат представления и модели работает как для SQL Server, так и для MySQL, поэтому, насколько я могу судить, у меня не должно быть проблем.Соединение базы данных PostgreSQL в asp.net mvc и Entity Framework 6

Приложение бросает в System.Data.dll в System.ArgumentException и возвращает ошибку:

Keyword not supported: metadata" "Parameter name: keyword

на веб-странице.

То, что используется System.Data.dll, кажется неправильным, но я не могу это подтвердить.

Как я могу подключиться к PostgreSQL таким образом?

У меня Nuget установлен Npgsql 3.0.5 и EntityFramework6.Npgsql 3.0.5.

Пожалуйста, дайте мне знать, если я оставил важную информацию.

Соответствующая web.config информация выглядит следующим образом:

<add name="PostgreSQLConnectionString" 
    connectionString=" 
    metadata=res://*/Models.Test.csdl|res://*/Models.Test.ssdl|res://*/Models.Test.msl; 
    provider=System.Data.SqlClient; 
    provider connection string=&quot; 
    data source=localhost:5432\; 
    initial catalog=Test; 
    integrated security=False; 
    user id=username; 
    password=password; 
    multipleactiveresultsets=True; 
    App=EntityFramework&quot;" 
    providerName="Npgsql" /> 

<provider invariantName="Npgsql" 
      type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql"> 
</provider> 

<remove invariant="Npgsql" /> 
<add name="Npgsql - .Net Data Provider for PostgreSQL" 
    invariant="Npgsql" 
    description=".Net Data Provider for PostgreSQL" 
    type="Npgsql.NpgsqlFactory, Npgsql, Version=3.0.5.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" /> 
+0

Я уверен, что провайдер будет что-то вроде 'Npgsql ', а не' System.Data.SqlClient', и я не уверен, что драйвер Postgres поддерживает MARS. [Вот пример] (http://rob.conery.io/2014/02/05/using-entity-framework-6-with-postgresql/) первой конфигурации кода. – StuartLC

+0

@StuartLC Это часть всего, все имена поставщиков - Npgsql. Я не уверен, почему его ссылки на System.Data.SqlClient вообще отсутствуют. – Kamurai

ответ

0

Я использую это в web.config:

<connectionStrings> 
    <add name="MyDbConnection" connectionString="server=localhost;port=5432;user id=myUser;password=myPassword;database=myDatabaseName" providerName="Npgsql" /> 
</connectionStrings> 
<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> 

Просто дружеское напоминание, чтобы NUGet "Npgsql" и «Npgsql для Entity Framework 6 ». ОБА «Npgsql» и «Npgsql Entity Framework 6» находятся на версии 3.0.4 (пожалуйста, проверьте).

+0

Настройки web.config, похоже, не имеют никакого значения, но я дважды проверю версии для Npgsql и Npgsql Entity Framework. Я думаю, что Npgsql 3.0.5, но я буду уверен. Спасибо. – Kamurai

+0

Да, оба были установлены с использованием 3.0.5. – Kamurai

0

Microsoft Visual Studio 2017

pm> Install-Package Npgsql -Version 2.2.0 
pm> Install-Package EntityFramework 

Web.config

<connectionStrings> 
    <add name="DefaultConnectionString" connectionString="server=localhost;user id=postgres;password=admin;database=api_db" providerName="Npgsql" /> 
</connectionStrings> 
<system.data> 
    <DbProviderFactories> 
     <add name="Npgsql Data Provider" 
      invariant="Npgsql" 
      support="FF" 
      description=".Net Framework Data Provider for Postgresql" 
      type="Npgsql.NpgsqlFactory, Npgsql" /> 
</DbProviderFactories> 
</system.data> 

Model

PGDbContext.cs 

using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Linq; 
using System.Web; 

namespace PgDemo.Models 
{ 
    public class PGDbContext: DbContext 
    { 
     public PGDbContext() : base(nameOrConnectionString: "DefaultConnectionString") { } 
     public virtual DbSet<Users> Usr { get; set; } 
    } 
} 

Users.cs

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Linq; 
using System.Web; 

namespace PgDemo.Models 
{ 
    [Table("users", Schema = "public")] 
    public class Users 
    { 
     [Key] 
     public int id { get; set; } 
     public string username { get; set; } 
     public string userpass { get; set; } 
    } 
} 

Controller

using PgDemo.Models; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace PgDemo.Controllers 
{ 
    public class HomeController : Controller 
    { 
     PGDbContext _context; 
     public HomeController() 
     { 
      _context = new PGDbContext(); 
     } 
     public ActionResult Index() 
     { 
      return View(_context.Usr.ToList()); 
     } 
    } 
} 

Views

@using PgDemo.Models 
@model IEnumerable<Users> 
<table border="1"> 
    @foreach (var item in Model) 
    { 
     <tr> 
      <td>@Html.DisplayFor(modelItem => item.id)</td> 
      <td> 
       @Html.DisplayFor(modelItem => item.username) 
      </td> 
      <td>@Html.DisplayFor(modelItem => item.userpass)</td> 
     </tr> 
    } 
</table> 
+0

JUST видел это. Я постараюсь поиграть с ним сегодня, если это возможно. – Kamurai

+0

Спасибо, но я все еще получаю «42P01: отношение» dbo.PostgreSQLTests «не существует» как ошибка. Проблема заключается в том, что она ищет таблицу SQL Server: PostgreSQL отформатирован «Test». «PostgreSQLTests»; – Kamurai

0

Добавление к выше ответа от @Ram Pukar: Убедитесь, что вы определили правильный table- и имени схемы в вашей модели. Схема по умолчанию в Postgres является «общедоступной», тогда как MsSQL (и EF) ожидает «dbo».

Если вы используете разделители слов, разделенные для имен столбцов, вы можете остановить EF жалуется, добавив псевдонимы столбцов в вашу Definiton, например:

[Table("your_table", Schema = "your_schema")] 
    public class YourModelName 
    { 
     [Key] 
     [Column("id_colum_name")] 
     public int Id { get; set; } 

     [Column("some_string_colum_name")] 
     public string SomeString{ get; set; } 
    } 
} 
+0

Спасибо, я буду изучать это, когда у меня будет такая возможность. – Kamurai

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

  • Нет связанных вопросов^_^