[英]Using Postgres in Asp.net 5 (vnext) with Npgsql
我已經將我的應用程序配置為連接到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:更新條目時發生錯誤。 有關詳細信息,請參見內部異常。 ---> Npgsql.NpgsqlException:23502:“ Id”列中的空值違反了非空約束em )em Npgsql.NpgsqlConnector.ReadSingleMessage(DataRowLoadingMode dataRowLoadingMode)em Npgsql.NpgsqlDataReader.ReadMessage()em Npgsql.NpgsqlDataReader.Init()em Npgsql.NpgsqlCommand.Execute(CommandBehavior行為)em Npgsql.NpgsqlCommand.Indbternal() NpgsqlCommand.ExecuteDbDataReader(CommandBehavior行為)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](IRelationalConnect 離子連接,功能
3 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(IEnumerable
1 commandBatches,IRelationalConnection連接),Microsoft.Data.Entity.Storage.RelationalDatabase.SaveChanges(IReadOnlyList1 entries) em Microsoft.Data.Entity.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList
Microsoft.Data.Entity.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList1 entries) em Microsoft.Data.Entity.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList
保存)和Microsoft.Data.Entity.ChangeTracking。 Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess)em Microsoft.Data.Entity.DbContext.SaveChanges(Boolean acceptAll ChangesOnSuccess)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)不適用F:\\ Dados \\ Documents \\ Visual Studio 2015 \\ Projects \\ SQLite \\ src \\ SQLite \\ Migrations \\ Seed.cs:linha 36 em SQLite.Startup.CreateSampleData(IServiceProvider F:\\ Dados \\ Documents \\ Visual Studio 2015 \\ Projects \\ SQLite \\ src \\ SQLite \\ Startup.cs:linha 138 em SQLite.Startup.Configure(IApplicationBuilder應用程序,IHostingEnvironment env,ILoggerFactory loggerFactory)無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;
所有這些代碼都是通過遷移自動生成的。
看起來您是使用SqlServer遷移生成了Postgres數據庫的。
我建議您還原並刪除所有遷移,然后再次添加遷移。
Postgres數據庫中的“ Id”列應為“ Serial”類型或類似名稱。
Postgres的“整數”類型不是自動遞增的類型。 默認情況下,分配ID是數據庫的角色。
嘗試將此注釋添加到“ Id”屬性上方。
DatabaseGenerated(DatabaseGeneratedOption.Identity)
相對。 這是一個相關的問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.