在asp.net MVC和Entity Framework 6 PostgreSQL数据库连接

问题描述 投票:0回答:3

我试图从我的ASP.NET MVC站点连接到PostgreSQL数据库。对于SQL Server和MySQL的视图和模型作品的格式,所以我不应该有问题出现,据我可以告诉。

该应用程序在System.ArgumentException投掷System.Data.dll并返回一个错误:

关键字不支持:元数据”,“参数名:关键字

在网页上。

它是使用System.Data.dll似乎是错误的,但我无法证实这一点。

我怎样才能连接到PostgreSQL以这种方式?

我的NuGet Npgsql的安装3.0.5和3.0.5 EntityFramework6.Npgsql。

请让我知道如果我离开的重要信息。

相关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" />
asp.net-mvc entity-framework visual-studio postgresql npgsql
3个回答
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的实体框架6”。无论是“Npgsql的”和“实体Npgsql的框架6”是在3.0.4版本(请)。


0
投票

微软的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>

模型

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

调节器

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

查看

@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
投票

向来自@Ram Pukar上面的回答:请确保您定义您的模型正确的表 - 和架构名称。在Postgres的默认模式是“公”,而MSSQL(和EF)预计“DBO”。

如果您使用的分隔符分隔的字列名,你可以停止EF通过添加列别名你definiton,e.g抱怨:

 [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; }
    }
 }
© www.soinside.com 2019 - 2024. All rights reserved.