実現したいこと
以下の事を実現したい
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=InnoDB 13AUTO_INCREMENT=18 14;
モデル
C#
1 public partial class TrUser 2 { 3 /// <summary> 4 /// ユーザID 5 /// </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
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
類似の例外「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
回答2件
あなたの回答
tips
プレビュー