C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: SaveChanges()の例外 C#


(過去ログ 176 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■101029 / inTopicNo.1)  SaveChanges()の例外 C#
  
□投稿者/ winter (1回)-(2022/12/12(Mon) 14:02:36)

分類:[.NET 全般] 


 [visualstudio2019 C# .Net]

 ご教授お願い致します。

 Entity Frameworkで、DBにアクセスしてInsert処理を行いたいのですが
 dbContext.SaveChanges()でcatchに入ってしまいます。


    using (var dbContext = new DBContext())
      {
          try
          {
              dbContext.Tables.Add(new Table
              {
                ID = "";
                Name = "";
                Age = "";
               });
        dbContext.SaveChanges();  ←ここで例外に飛びます
           }
           catch (Exception ex)
           {
                LogManager.GetLogger(GetType().FullName).Error($"{ex.Message}\r\n{ex.StackTrace}");
           }
       }
 内容は
   CSVChecker.Form1  Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
   CSVChecker.Form1  An error occurred while updating the entries. See the inner exception for details.
   場所 System.Data.Entity.Internal.InternalContext.SaveChanges()
   場所 System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
   場所 System.Data.Entity.DbContext.SaveChanges()

 Config設定は確認しました。
 Tableクラスは必要なTableだけを自動生成しました。

 何かわかればお願い致します。


引用返信 編集キー/
■101030 / inTopicNo.2)  Re[1]: SaveChanges()の例外 C#
□投稿者/ WebSurfer (2593回)-(2022/12/12(Mon) 14:48:53)
No101029 (winter さん) に返信

> CSVChecker.Form1 Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

EntityValidationErrors の中身は見たのですか?
引用返信 編集キー/
■101031 / inTopicNo.3)  Re[2]: SaveChanges()の例外 C#
□投稿者/ Hongliang (1257回)-(2022/12/12(Mon) 14:54:06)
> CSVChecker.Form1 An error occurred while updating the entries. See the inner exception for details.
あとInnerExceptionも。
例外をログ出力するときは、ex.Messageとかex.StackTraceとか個別に出すのではなくて、ex.ToString()をそのまま出すのをお勧めします。
引用返信 編集キー/
■101032 / inTopicNo.4)  Re[1]: SaveChanges()の例外 C#
□投稿者/ WebSurfer (2594回)-(2022/12/12(Mon) 14:56:02)
No101029 (winter さん) に返信

参考:

[EntityFramework]SaveChanges() 時の検証
http://itkaeru.blogspot.com/2013/03/entityframeworksavechanges.html
引用返信 編集キー/
■101033 / inTopicNo.5)  Re[2]: SaveChanges()の例外 C#
□投稿者/ winter (3回)-(2022/12/12(Mon) 15:25:08)
No101032 (WebSurfer さん) に返信
> http://itkaeru.blogspot.com/2013/03/entityframeworksavechanges.html

例外がスローされました: 'System.Data.Entity.Infrastructure.DbUpdateException' (EntityFramework.dll の中)
ていう形でしか確認の仕方がわからなくって,,

参考文献にいただいた文の[System.Data.Entity.Infrastructure.DbUpdateException]に
書き換えてログを観たいのですが、foreachに何を指定すればよいでしょうか

                catch (System.Data.Entity.Infrastructure.DbUpdateException ex)
                {
                    foreach (var errors in ex.[//当てはめるべき文字])
                    {
                        foreach (var error in errors.[//当てはめるべき文字])
                        {
                 LogManager.GetLogger(GetType().FullName).Error(ex.ToString());
                            System.Diagnostics.Trace.WriteLine(error.ErrorMessage);
                        }
                    }
                    throw ex;
                }
                    

引用返信 編集キー/
■101034 / inTopicNo.6)  Re[3]: SaveChanges()の例外 C#
□投稿者/ winter (4回)-(2022/12/12(Mon) 15:25:50)
No101031 (Hongliang さん) に返信
> 例外をログ出力するときは、ex.Messageとかex.StackTraceとか個別に出すのではなくて、ex.ToString()をそのまま出すのをお勧めします。

ありがとうございます。
早速使っていきます。
引用返信 編集キー/
■101035 / inTopicNo.7)  Re[3]: SaveChanges()の例外 C#
□投稿者/ winter (6回)-(2022/12/12(Mon) 16:10:43)
■(Hongliang さん)(WebSurfer さん) に返信

参考文献のエラーを出せる環境にして再度流してみたら
[〇〇のフィールドがありません]と出たのでテーブルのカラム全てをInsert処理を行ったところ
書きこみに成功しました。

[System.Data.Entity.Infrastructure.DbUpdateException]がでた理由は同じ内容があったからなのかな
と自分の中では考えてます。

エラーの中身を見るということを初めて学べました!
解決済み
引用返信 編集キー/
■101036 / inTopicNo.8)  Re[3]: SaveChanges()の例外 C#
□投稿者/ WebSurfer (2595回)-(2022/12/12(Mon) 16:17:16)
No101033 (winter さん) に返信

> 参考文献にいただいた文の[System.Data.Entity.Infrastructure.DbUpdateException]に
> 書き換えてログを観たいのですが、foreachに何を指定すればよいでしょうか

何故ですか?

> See 'EntityValidationErrors' property for more details.

ということは、スローされているのは DbEntityValidationException だと思うのですが違うのですか?

引用返信 編集キー/
■101040 / inTopicNo.9)  Re[4]: SaveChanges()の例外 C#
□投稿者/ winter (7回)-(2022/12/14(Wed) 16:44:03)
No101036 (WebSurfer さん) に返信

>>参考文献にいただいた文の[System.Data.Entity.Infrastructure.DbUpdateException]に
>>書き換えてログを観たいのですが、foreachに何を指定すればよいでしょうか
>
> 何故ですか?
DBに既に読み込みたい値があったときDbUpdateExceptionになりました。
全てのカラムに値を入れてあげない状態でInsertしようとしたら DbEntityValidationException が出てきた感じです。


引用返信 編集キー/
■101041 / inTopicNo.10)  Re[5]: SaveChanges()の例外 C#
□投稿者/ WebSurfer (2596回)-(2022/12/14(Wed) 17:53:23)
No101040 (winter さん) に返信

> DBに既に読み込みたい値があったときDbUpdateExceptionになりました。
> 全てのカラムに値を入れてあげない状態でInsertしようとしたら DbEntityValidationException が出てきた感じです。

話が分からないのですが。

最初の質問では、

> Insert処理を行いたいのですが

という話で、

> CSVChecker.Form1 Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

というエラーメッセージだったのですよね。その時の問題の話をしていたのではなかったのですか? 

EntityValidationErrors プロパティは DbUpdateException にはありません。DbEntityValidationException
の話ではなかったのですか?

DbUpdateException クラス
https://learn.microsoft.com/ja-jp/dotnet/api/system.data.entity.infrastructure.dbupdateexception?view=entity-framework-6.2.0

DbEntityValidationException クラス
https://learn.microsoft.com/ja-jp/dotnet/api/system.data.entity.validation.dbentityvalidationexception?view=entity-framework-6.2.0
引用返信 編集キー/
■101042 / inTopicNo.11)  Re[6]: SaveChanges()の例外 C#
□投稿者/ winter (8回)-(2022/12/15(Thu) 10:28:37)
No101041 (WebSurfer さん) に返信
> 話が分からないのですが。

string型 ID,Name,Age,Birthday
DateTime型 Insertday
計5つのカラムがあるテーブルに
  using (var dbContext = new DBContext())
{
try
{
dbContext.Tables.Add(new Table
{
ID = "";
Name = "";
Age = "";
});
        dbContext.SaveChanges();  
}
    }
抜けてるカラムがある状態で実行すると[Birthday]のフィールドがありませんとなり、[DbEntityValidationException]が出ました

dbContext.Tables.Add(new Table
{
ID = "";
Name = "";
Age = "";
        Birthday = "";
Insertday = "";
});
        dbContext.SaveChanges();
すべてのカラムに値を入れて[SaveChanges()]を使うと、例外が出ずDBに値が登録されていました。

[DbUpdateException]が出たのは、値が全く同じものをinsertしようとしたときに出てきました

引用返信 編集キー/
■101043 / inTopicNo.12)  Re[7]: SaveChanges()の例外 C#
□投稿者/ WebSurfer (2597回)-(2022/12/15(Thu) 11:32:29)
No101042 (winter さん) に返信

> 抜けてるカラムがある状態で実行すると[Birthday]のフィールドがありませんとなり、[DbEntityValidationException]が出ました

DB の Birthday フィールドは NULL 不可になっていて、「抜けてるカラムがある状態」では NULL を
INSERT しようとして失敗したと想像してますが違いますか? 


> [DbUpdateException]が出たのは、値が全く同じものをinsertしようとしたときに出てきました

そこは依然として話が分かりません。再現できるのであれば DbUpdateException の InnerException
を調べてみてください。
引用返信 編集キー/
■101044 / inTopicNo.13)  Re[7]: SaveChanges()の例外 C#
□投稿者/ 魔界の仮面弁士 (3510回)-(2022/12/15(Thu) 11:35:15)
No101042 (winter さん) に返信
> string型 ID,Name,Age,Birthday
> DateTime型 Insertday
Birthday は日付型では無いのですね。


> 抜けてるカラムがある状態で実行すると[Birthday]のフィールドがありませんとなり、[DbEntityValidationException]が出ました

データベース側において、Birthday は null 許容のフィールドなのでしょうか?

null 不許可なのであれば、フィールド値を明示しないと、
INSERT 処理時に 検証(validation)エラーになってしまうかと。

null 不許可だが、空文字列は許容するといった定義になっている場合は、
Table の該当プロパティに対して [Required(AllowEmptyStrings = true)] の属性を
指定することで、空文字の登録が可能になるかと思います。


> [DbUpdateException]が出たのは、値が全く同じものをinsertしようとしたときに出てきました

テーブルに主キー(あるいはユニークキー)が設定されている場合、
既に登録済みのデータを追加しようとすれば、
重複エラーとして拒絶されることになるでしょう。
引用返信 編集キー/
■101045 / inTopicNo.14)  Re[8]: SaveChanges()の例外 C#
□投稿者/ winter (10回)-(2022/12/15(Thu) 12:00:01)
No101043 (WebSurfer さん) に返信
> DB の Birthday フィールドは NULL 不可になっていて、「抜けてるカラムがある状態」では NULL を
> INSERT しようとして失敗したと想像してますが違いますか? 

 NUll不可だったのでそれかと思います


> そこは依然として話が分かりません。再現できるのであれば DbUpdateException の InnerException
> を調べてみてください。

再現できるのですがその調べ方がわかりません,,
引用返信 編集キー/
■101046 / inTopicNo.15)  Re[8]: SaveChanges()の例外 C#
□投稿者/ winter (11回)-(2022/12/15(Thu) 12:03:31)
No101044 (魔界の仮面弁士 さん) に返信

> Birthday は日付型では無いのですね。

 そうです。

> データベース側において、Birthday は null 許容のフィールドなのでしょうか?
> null 不許可なのであれば、フィールド値を明示しないと、
> INSERT 処理時に 検証(validation)エラーになってしまうかと。
> null 不許可だが、空文字列は許容するといった定義になっている場合は、
> Table の該当プロパティに対して [Required(AllowEmptyStrings = true)] の属性を
> 指定することで、空文字の登録が可能になるかと思います。

Null不可でした。
なるほどですね!

> テーブルに主キー(あるいはユニークキー)が設定されている場合、
> 既に登録済みのデータを追加しようとすれば、
> 重複エラーとして拒絶されることになるでしょう。

重複で[DbUpdateException]が出てるんですね
引用返信 編集キー/
■101047 / inTopicNo.16)  Re[9]: SaveChanges()の例外 C#
□投稿者/ WebSurfer (2598回)-(2022/12/15(Thu) 14:48:11)
No101045 (winter さん) に返信

> 再現できるのですがその調べ方がわかりません,,

例えば以下のように DbUpdateException を catch できるようにして、

try
{
    dbContext.SaveChanges();
}
catch (DbUpdateException e)
{
}

デバッガで e の中身を見てください。EF6 ならその InnerException の中の InnerException 
が SqlException になっているはずなのでそれを見れば分かります。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -