はじめに
Entity Framework(EF)を使用している際に、以下の2つの問題が発生しました。
- 裏で自動マッピング設定されてしまったことに伴うエラー
- InsertとSelectで異なるテーブルにアクセス
これらの問題を解決するために行った手順を共有します。
問題の概要
1. 裏で自動マッピング設定されてしまったことに伴うエラー
以下のエラーメッセージが表示されました。
The model backing the 'ApplicationDbContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).
これは、エラーの内容の通り、自動でマッピング設定がされていたために、DB側の設定が変わっていないのにCode側で変更を加えたというエラーが出てしまっていたということです。DB側の設定を正にしたかったので、勝手に自動でマッピングされる設定をOffにする必要がありました。
2. InsertとSelectで異なるテーブルにアクセス
自動でマッピングされてしまっていた結果、Insert操作ではUserInfoes
テーブルにアクセスし、Select操作ではUserInfo
テーブルにアクセスするという問題が発生しました。しかもUserInfoes
テーブルは既に削除してしまいました。
解決方法
1. DbContextクラスの修正
まず、DbContext
クラスを修正し、自動マイグレーションを無効にしました。
using System.Data.Entity;
namespace UserCreator.Models
{
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext() : base("DBConnectionString")
{
Database.SetInitializer(null); // Disable automatic migration
}
public DbSet<UserInfo> UserInfos { get; set; }
}
}
2. モデルクラスの修正
次に、モデルクラスにテーブル名を明示的に指定しました。
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace UserCreator.Models
{
[Table("UserInfo")]
public class UserInfo
{
[Key]
public string UserId { get; set; }
public string Status { get; set; }
public DateTime CreatedDate { get; set; }
public DateTime UpdatedDate { get; set; }
}
}
結果
これらの変更を行ったことで、InsertとSelectの両方の操作が同じテーブルに対して行われるようになり、エラーが解消されました。
まとめ
Entity Frameworkを使用する際には、モデルクラスとデータベースのマッピング設定が一致していることを確認することが重要です。今回のような問題が発生した場合は、モデルクラスやDbContext
クラスの設定を見直し、必要に応じて修正することで解決できます。