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

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

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

Re[1]: EFでのUpDate文


(過去ログ 172 を表示中)

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

■98908 / inTopicNo.1)  EFでのUpDate文
  
□投稿者/ 初心のもの (38回)-(2022/01/18(Tue) 12:14:00)

分類:[.NET 全般] 


 [C# visual studio2019]

  毎度すいません。いつも助かっているのでまたの教えてもらいたいです。

 毎回質問が似てるのですが、C#,Entity frameworkを使っての[UpDate]を試みてます。
  SQLからTextBoxに入力されているID(主キー)を確認して、データがなければ[Insert]、あれば[UpDate]をボタン一つで実行してもらいたいのですが
 [Insert]はできるのですが、[UpDate]だけcatchに入ってエラーを吐き出されます。
 
  log内容
 2022-01-18 11:59:51,418  ERROR  [1]    MainWindow.Form1  Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
   場所 System.Data.Entity.Internal.InternalContext.SaveChanges()
   場所 System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
   場所 System.Data.Entity.DbContext.SaveChanges()
   場所 MainWindow.Form1.Up_InserBtm_Click(Object sender, EventArgs e) 場所 \MainWindow\Form1.cs:行 134

 SaveChanges()がうまく動作してない感じです
[code]
        private void Up_InserBtm_Click(object sender, EventArgs e)
        {
            var idBox = PatientIDBox;
            var nBox1 = PatientsNameBox1;
            var nBox2 = PatientsNameBox2;
            var nBox3 = PatientsNameBox3;
            var bdBox = PatientsBDBox;
            var sexBox = PatientsSexBox;
            var ageBox = PatientsAgeBox;

            using (var pdbContext = new PDBContext())
            {

                try
                {
                    var patient = pdbContext.M_Patient.FirstOrDefault(x => x.PatientID == idBox.Text);
                    if (patient == null)
                    {
                        pdbContext.M_Patient.Add(new M_Patient
                        {
                            PatientID = idBox.Text,
                            PatientsName1 = nBox1.Text,
                            PatientsName2 = nBox2.Text,
                            PatientsName3 = nBox3.Text,
                            PatientsBirthDate = bdBox.Text,
                            PatientsSex = sexBox.Text,
                            PatientsAge = ageBox.Text,
                            InsertDate = DateTime.Now,
                            UpdateDate = DateTime.Now
                        });
                    }
                    else                                              //ここがUpdate文のつもり
                    {
                            M_Patient add_Patient = new M_Patient      
                            {
                                PatientsName1 = nBox1.Text,
                                PatientsName2 = nBox2.Text,
                                PatientsName3 = nBox3.Text,
                                PatientsBirthDate = bdBox.Text,
                                PatientsSex = sexBox.Text,
                                PatientsAge = ageBox.Text,
                                InsertDate = DateTime.Now,
                                UpdateDate = DateTime.Now
                            };
                            pdbContext.M_Patient.Add(add_Patient);
                    }
                    pdbContext.SaveChanges();
                }
                catch (Exception ex)
                {
                    LogManager.GetLogger(GetType().FullName).Error($"{ex.Message}\r\n{ex.StackTrace}");
                    while ((ex = ex.InnerException) != null)
                    {
                        LogManager.GetLogger(GetType().FullName).Error($"{ex.Message}\r\n{ex.StackTrace}");
                    }
                }
                finally
                {
                    pdbContext.Dispose();
                }
            }
        }
[/code]

  何かわかればお願いしたいです

引用返信 編集キー/
■98909 / inTopicNo.2)  Re[1]: EFでのUpDate文
□投稿者/ 初心のもの (39回)-(2022/01/18(Tue) 12:15:09)



 ネット上のgoogleで調べたものはあらかた試したつもりです。
引用返信 編集キー/
■98910 / inTopicNo.3)  Re[2]: EFでのUpDate文
□投稿者/ Hongliang (1210回)-(2022/01/18(Tue) 12:46:43)
Googleより先に
> Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
って出てるのだからまずこのEntityValidationErrorsプロパティを確認すべきでは…?

Updateする場合、newしてAddするのではなく、コンテキストから取得したオブジェクトのプロパティを更新するようにします。
var patient = pdbContext.M_Patient.FirstOrDefault(x => x.PatientID == idBox.Text);
patient.PatientsName1 = nBox1.Text;
...
pdbContext.Update();

// InsertDateまで更新するのはダメじゃないかな…。
引用返信 編集キー/
■98911 / inTopicNo.4)  Re[1]: EFでのUpDate文
□投稿者/ WebSurfer (2409回)-(2022/01/18(Tue) 13:43:17)
No98908 (初心のもの さん) に返信

基本は、以下の記事に書かれているように、

エンティティの状態の操作
https://docs.microsoft.com/ja-jp/ef/ef6/saving/change-tracking/entity-state

(1) INSERT の場合は「新しいエンティティをコンテキストに追加する」のセクションに
  書かれているように、エンティティの状態を Added にしてコンテキストに SaveChanges 
  メソッドを適用する、

(2) UPDATE の場合は「既存の変更済みエンティティをコンテキストにアタッチする」の
  セクションに書かれているように、エンティティの状態を Modified にしてコンテ
  キストに SaveChanges メソッドを適用する

・・・です。

エンティティの状態を Modified にするには、上の記事に書かれている方法の他に、
諮問者さんのケースでは変数  patient にコンテキストに追跡されているエンティ
ティを取得しているので、そのプロパティを書き換えることで可能です。

例えば、PatientsName1, PatientsName2 などのプロパティがあるとすると、else の
ところで以下のようにプロパティに代入にしてやれば、そのエンティティの状態は 
Modified になります。

else               //ここがUpdate文のつもり
{
    patient.PatientsName1 = nBox1.Text,
    patient.PatientsName2 = nBox2.Text,
    // ・・・中略・・・       
}

pdbContext.M_Patient.Add(add_Patient); とかは不要です。

代入した値が前の値と違えば状態は Modified になるので、その後、即 SaveChanges 
で UPDATE されるはずです。お試しください。


引用返信 編集キー/
■98912 / inTopicNo.5)  Re[3]: EFでのUpDate文
□投稿者/ 初心のもの (41回)-(2022/01/18(Tue) 13:59:52)
No98910 (Hongliang さん) に返信
> Updateする場合、newしてAddするのではなく、コンテキストから取得したオブジェクトのプロパティを更新するようにします。
> // InsertDateまで更新するのはダメじゃないかな…。

 Unchanged状態ではだめだよって解釈でいいんですかね?
 参考文献ありがとうございます!

No98911 (WebSurfer さん) に返信

いつもありがとうございます。
 すごくわかりやすくこたえまでいただけて、、
  else
{
patient.PatientID = idBox.Text;
patient.PatientsName1 = nBox1.Text;
patient.PatientsName2 = nBox2.Text;
patient.PatientsName3 = nBox3.Text;
patient.PatientsBirthDate = bdBox.Text;
patient.PatientsSex = sexBox.Text;
patient.PatientsAge = ageBox.Text;
patient.InsertDate = DateTime.Now;
patient.UpdateDate = DateTime.Now;
}
pdbContext.SaveChanges();

  これでcatchに入らず抜けました!
> UPDATE の場合は「既存の変更済みエンティティをコンテキストにアタッチする」の
> セクションに書かれているように、エンティティの状態を Modified にしてコンテ
> キストに SaveChanges メソッドを適用する

  めちゃくちゃわかりやすかったですありがとうございます!
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -