PostgreSQL環境下では正常動作してたプログラムをMySql環境へ移行したところ例外「System.InvalidCastException」が発生する。それを解決したい。

実現したいこと

以下の事を実現したい
1.DBをPostgreSQL 16.0からMySql8.0.36へ移行する。
2.EFCoreをNpgsql.EntityFrameworkCore.PostgreSQL8.0.2からMySql.EntityFrameworkCore8.0.0へ移行する。
3.Npgsql.EntityFrameworkCore.PostgreSQL8.0.2では、動作確認が取れている既存プログラムを動かしたい

発生している問題・分からないこと

該当ソース13行目のToList()メソッド実行時に例外「System.InvalidCastException」が発生する。

上記キャスト例外が発生している箇所と思われる関連情報

SQL

1該当テーブル 2CREATE TABLE `tr_user` (3 `user_id` BIGINT(19) NOT NULL AUTO_INCREMENT COMMENT 'ユーザID',4<中略>5 `birth_day` DATE NULL DEFAULT NULL COMMENT '生年月日',6<中略>7 `withdrawal_date` DATE NULL DEFAULT NULL COMMENT '退会日付',8<中略>9)10COMMENT='ユーザ情報'11COLLATE='utf8mb4_0900_ai_ci'12ENGINE=InnoDB13AUTO_INCREMENT=1814;

モデル

C#

1 public partial class TrUser 2 {3 /// <summary>4 /// ユーザID5 /// </summary>6 public long UserId { get; set; }7 /// <summary>8<中略>9 /// 生年月日10 /// </summary>11 public DateOnly? BirthDay { get; set; }12<中略>13 /// <summary>14 /// 退会日付15 /// </summary>16 public DateOnly? WithdrawalDate { get; set; }17<中略>18 }

DBコンテキスト

C#

1 public partial class XXXDbContext : DbContext 2 {3 4<中略>5 protected override void OnModelCreating(ModelBuilder modelBuilder)6 {7<中略>8 modelBuilder.Entity<TrUser>(entity =>9 {10 entity.HasKey(e => e.UserId)11 .HasName("pk_tr_user");12 13<中略>14 entity.Property(e => e.UserId)15 .HasColumnName("user_id")16 .HasComment("ユーザID")17 .UseIdentityAlwaysColumn();18 19<中略>20 21 entity.Property(e => e.BirthDay)22 .HasColumnName("birth_day")23 .HasComment("生年月日");24 25<中略>26 entity.Property(e => e.WithdrawalDate)27 .HasColumnName("withdrawal_date")28 .HasComment("退会日付");29 30<中略>31 });32 }33 }

エラーメッセージ

error

1Unable to cast object of type 'System.DateTime' to type 'System.DateOnly'.

該当のソースコード

c#

1 public List<TrUser> SelectByMailAddressOrUserCd(string MailAddress)2 {3 var result = new List<TrUser>();4 DbTask.ReadOnly(db =>5 {6 var userQuery = db.TrUsers.Where(_X => _X.UserCd == MailAddress).OrderBy(_X => _X.DeleteFlg);7 if (!userQuery.Any())8 {9 userQuery = db.TrUsers.Where(_X => _X.MailAddress == MailAddress).OrderBy(_X => _X.DeleteFlg);10 }11 result = userQuery.ToList();12 });13 14 return result;15 }16

試したこと・調べたこと

上記の詳細・結果

類似の例外「System.InvalidCastException: Unable to cast object of type 'System.DateTime' to type 'System.DateTimeOffset'.」情報は見つけたが、開発環境.net5.0が古いのとCloseされていないので、参考にはならなかった。
[リンク内容]
https://github.com/VahidN/EFCoreSecondLevelCacheInterceptor/issues/131

.net6.0環境でのDateOnlyキャストエラーの記事についても試したが、駄目だった。
[リンク内容]
https://qiita.com/nacopon/items/10977d516e2a79b8dcc3

補足

言語:c#
開発環境:.net8.0 Entity Framework Core 8.0
データベース: MySql 8.0.36

コメントを投稿

0 コメント