質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

12926閲覧

Entity Frameworkを利用した、アップデート処理がうまくいかない

Anpai

総合スコア27

Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2020/02/24 16:17

Entity Frameworkを使用してPostgresqlのDBにインサートとアップデートの処理を行いたいと考えています。
しかし、インサートの処理はうまく動くが、アップデートの処理がうまくいきません。

メインメソッドの「db.SaveChanges();」で主キーが一致する場合はUpdateが実行され一致しない場合は、insertが実行される想定ですが、違うのでしょうか。
申し訳ありませんが教えてください。

表示されるエラーメッセージは下記のとおりです。
{"An error occurred while updating the entries. See the inner exception for details."}

C#

1using ConsoleApp2.Entity; 2using System; 3using System.Collections.Generic; 4using System.Linq; 5using System.Text; 6using System.Threading.Tasks; 7 8namespace ConsoleApp2 9{ 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 using (var db = new TestContext()) 15 { 16 var tan = new TestTable(); 17 tan.yearmonthday = DateTime.ParseExact("2020/02/24", "yyyy/MM/dd", null); 18 tan.basyo = "00"; 19 tan.num = 2; 20 tan.chaku1 = 0; 21 tan.chaku2 = 0; 22 tan.chaku3 = 0; 23 tan.happyotime = DateTime.ParseExact("2020/02/24", "yyyy/MM/dd", null); 24 tan.str1 = "aa"; 25 tan.str2 = "bb"; 26 27 db.testTable.Add(tan); 28 29 try 30 { 31 db.SaveChanges(); 32 } 33 catch (Exception ex) 34 { 35 Console.WriteLine(ex.ToString()); 36 throw ex; 37 } 38 db.Dispose(); 39 } 40 } 41 } 42} 43

C#

1using ConsoleApp2.Entity; 2using Microsoft.EntityFrameworkCore; 3using System; 4using System.Collections.Generic; 5using System.Linq; 6using System.Text; 7using System.Threading.Tasks; 8 9namespace ConsoleApp2 10{ 11 class TestContext : DbContext 12 { 13 public DbSet<TestTable> testTable { get; set; } 14 15 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 16 { 17 optionsBuilder.UseNpgsql("Host=localhost;Username=postgres;Password=postgres;Database=postgres"); 18 } 19 protected override void OnModelCreating(ModelBuilder modelBuilder) 20 { 21 modelBuilder.Entity<TestTable>() 22 .HasKey(c => new { c.yearmonthday, c.basyo, c.num, c.chaku1, c.chaku2, c.chaku3}); 23 } 24 } 25} 26 27

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel.DataAnnotations.Schema; 4using System.Linq; 5using System.Text; 6using System.Threading.Tasks; 7 8namespace ConsoleApp2.Entity 9{ 10 public class TestTable 11 { 12 public DateTime yearmonthday { get; set; } 13 14 public string basyo { get; set; } 15 16 public int num { get; set; } 17 18 public int chaku1 { get; set; } 19 20 public int chaku2 { get; set; } 21 22 public int chaku3 { get; set; } 23 24 public DateTime happyotime { get; set; } 25 26 public string str1 { get; set; } 27 28 public string str2 { get; set; } 29 } 30} 31

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/24 22:25

inner exception はどうなってますか? (throw ex とするとスタックトレースが途切れるので、もしそれが原因で inner exception が取れないと言うことなら、単に throw としてください)
hihijiji

2020/02/25 01:06

Entity Framework はバージョンによって挙動が別物Frameworkってぐらい違います。 最低限バージョンは書いてください。
guest

回答2

0

update するためには、SaveChanged する前に、当該エンティティの State を EntityState.Modified に設定する必要があります。

コードには Add しか見当たりませんが、それでは EntityState.Added になるはずなので、insert 操作になるのですが、主キーが存在するのでエラーになったということでしょう。

Entity Framework が主キーの有無を調べて、EntityState の Added ⇔ Modified 自動的に切り替えてくれると言うことはありません。

【追記】

上に書いたことを理解するのに役に立ちそうな Microsoft のドキュメントを紹介しておきます。最後のセクション Insert or update pattern が参考になるかも。

Working with entity states
https://docs.microsoft.com/en-us/ef/ef6/saving/change-tracking/entity-state

日本語版もありますが(en-us ⇒ ja-jp とすれば読めます)、翻訳がダメダメなので英語版を見ることをお勧めします。

投稿2020/02/24 22:43

編集2020/02/25 01:01
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

回答を基にアップデートする際は呼び出し方法を変更しました。

C#

1 //db.testTable.Add(tan); 2 db.testTable.Update(tan); 3 db.SaveChanges();

これにより、InsertではなくUpdateが実行されるようになりました。

また、Entity Frameworkは「Npgsql.EntityFrameworkCore.PostgreSQL」を使用していました。

ご協力ありがとうございました。

投稿2020/02/25 14:55

Anpai

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問