c# - 在 Asp.net 5 (vnext) 中使用 Postgres 和 Npgsql

标签 c# asp.net-mvc postgresql

我已将我的应用程序配置为连接到 Postgres 数据库,但在向其加载一些数据时,出现错误。

首先,这是我在 project.json 中包含的内容:

"EntityFramework7.Npgsql": "3.1.0-rc1-1",

在 Startup.cs 类中:

services.AddEntityFramework()
            .AddNpgsql()
            .AddDbContext<ApplicationDbContext>(options =>
                    options.UseNpgsql(Configuration["Data:DefaultConnection:ConnectionString"]));

这是我的连接字符串:

Server=127.0.0.1;Port=5432;Database=test1;User Id=postgres;Password=mypass123

更新数据库的 dnx 命令运行良好,但我必须手动创建“__EFMigrationsHistory”表。

问题是执行context.SaveChanges时出现以下错误:

{Microsoft.Data.Entity.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> Npgsql.NpgsqlException: 23502: null value in column "Id" violates not-null constraint em Npgsql.NpgsqlConnector.DoReadSingleMessage(DataRowLoadingMode dataRowLoadingMode, Boolean returnNullForAsyncMessage, Boolean isPrependedMessage) em Npgsql.NpgsqlConnector.ReadSingleMessageWithPrepended(DataRowLoadingMode dataRowLoadingMode, Boolean returnNullForAsyncMessage) em Npgsql.NpgsqlConnector.ReadSingleMessage(DataRowLoadingMode dataRowLoadingMode) em Npgsql.NpgsqlDataReader.ReadMessage() em Npgsql.NpgsqlDataReader.Init() em Npgsql.NpgsqlCommand.Execute(CommandBehavior behavior) em Npgsql.NpgsqlCommand.ExecuteDbDataReaderInternal(CommandBehavior behavior) em Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior) em System.Data.Common.DbCommand.ExecuteReader() em Microsoft.Data.Entity.Storage.Internal.RelationalCommand.<>c__DisplayClass17_0.b__0(DbCommand cmd, IRelationalConnection con) em Microsoft.Data.Entity.Storage.Internal.RelationalCommand.Execute[T](IRelationalConnection connection, Func3 action, String executeMethod, Boolean openConnection, Boolean closeConnection) em Microsoft.Data.Entity.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, Boolean manageConnection) em Microsoft.Data.Entity.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection) --- Fim do rastreamento de pilha de exceções internas --- em Microsoft.Data.Entity.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection) em Microsoft.Data.Entity.Update.Internal.BatchExecutor.Execute(IEnumerable1 commandBatches, IRelationalConnection connection) em Microsoft.Data.Entity.Storage.RelationalDatabase.SaveChanges(IReadOnlyList1 entries) em Microsoft.Data.Entity.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList1 entriesToSave) em Microsoft.Data.Entity.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess) em Microsoft.Data.Entity.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess) em Microsoft.Data.Entity.DbContext.SaveChanges() em SQLite.Migrations.Seed.CriaEndereco() na F:\Dados\Documents\Visual Studio 2015\Projects\SQLite\src\SQLite\Migrations\Seed.cs:linha 73 em SQLite.Migrations.Seed.Execute(IServiceProvider applicationServices) na F:\Dados\Documents\Visual Studio 2015\Projects\SQLite\src\SQLite\Migrations\Seed.cs:linha 36 em SQLite.Startup.CreateSampleData(IServiceProvider applicationServices) na F:\Dados\Documents\Visual Studio 2015\Projects\SQLite\src\SQLite\Startup.cs:linha 138 em SQLite.Startup.Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) na F:\Dados\Documents\Visual Studio 2015\Projects\SQLite\src\SQLite\Startup.cs:linha 128}

Id 列是否应该由实体分配?

相同的代码在 SqlServer 中工作。

更新

这是 SqlServer 表架构:

CREATE TABLE [dbo].[Ufs] (
    [Id]    INT           IDENTITY (1, 1) NOT NULL,
    [Nome]  NVARCHAR (70) NOT NULL,
    [Sigla] NVARCHAR (2)  NOT NULL,
    CONSTRAINT [PK_Uf] PRIMARY KEY CLUSTERED ([Id] ASC)
);

这里是 Postgres:

CREATE TABLE public."Ufs"
(
  "Id" integer NOT NULL,
  "Nome" text NOT NULL,
  "Sigla" text NOT NULL,
  CONSTRAINT "PK_Uf" PRIMARY KEY ("Id")
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public."Ufs"
  OWNER TO postgres;

所有这些代码都是由迁移自动生成的。

最佳答案

看起来您使用 SQL Server 迁移生成了 Postgres 数据库。

我建议您还原并删除所有迁移,然后重新添加迁移。

关于c# - 在 Asp.net 5 (vnext) 中使用 Postgres 和 Npgsql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34017630/

相关文章:

postgresql - 原生扩展 Dart

c# - DDD 中的每个服务类都有一个接口(interface)是一种好的设计实践吗?

regex - 如何在 PostgreSQL 中提取数字后跟特定字符串?

c# - 对 GridView 行执行操作的最佳方式

c# - 我在 asp.net MVC 中进行 session 处理它适用于 View 页面按钮我无法在 Controller 中的另一个操作上获取 session

c# - 从azure blob下载文件并出现空pdf页面

asp.net - .cshtml 文件显示为纯 html

postgresql - 将 9.3 迁移到 9.4 postgres 时选择哪一个(pg_basebackup 或 pg_dumpall)

c# - process.WaitForExit(int32) 异步

c# - MvvmCross : conventional plugin bypass