我试图从我的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="
data source=localhost:5432\;
initial catalog=Test;
integrated security=False;
user id=username;
password=password;
multipleactiveresultsets=True;
App=EntityFramework""
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" />
我在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版本(请)。
微软的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>
向来自@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; }
}
}