既存のデータベースでコードファーストでEntityFramework 6を使用していますが、エンティティをデータベーステーブルにマッピングする際に問題が発生します。
通常、私はデータベースファーストのアプローチを使用し、エンティティとコンテキストコードを生成しますが、デザイナーの使用は非常に困難になっています。
EFにスキーマを変更させたくないので、Database.SetInitializer(null)を設定しました。
データベーススキーマ:
コードファースト:
public class Project
{
public int ProjectId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
public class ReleaseControlContext : DbContext
{
public ReleaseControlContext()
: base(ConfigurationManager.ConnectionStrings["ReleaseControl"].ConnectionString)
{
Database.SetInitializer<ReleaseControlContext>(null);
}
public DbSet<Project> Projects { get; set; }
}
発信コード:
using(var context = new ReleaseControlContext())
{
var projects = context.Projects.ToList();
}
次の例外がスローされます。
SqlException:無効なオブジェクト名 'dbo.Projects'。
これは、私のデータベーステーブルがProjectであり、Projectsではないためです。コンテキストのDbSet<Project>
の名前を「プロジェクト」に変更したくないのは、意味的に正しくないためです。
質問:
ProjectデータベーステーブルとDbSet<Project> Projects
コレクションの間をマッピングするために、流暢なAPI /データアノテーションを使用する必要がありますか?
あなたは使用することができます
_[Table("Project")]
public class Project {
....
}
_
プロジェクトエンティティに対する注釈、またはOnModelCreating(DbModelBuilder modelBuilder)
でmodelBuilder.Entity<Project>().ToTable("Project");
を呼び出すことができます。
どちらも同じことをします。
ジェネリッククラスEntityTypeConfiguration(T)
から継承するクラス(つまり:ProjectMap
)を定義する必要があります。ここで、T
はここではProject
クラスです。このProjectMap
クラスでは、テーブルマッピングを明示的に定義できます。
this.ToTable("Project", "dbo");
クラスProjectMap
は、DbContext
クラスの次のメソッドで呼び出す必要があります
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ProjectMap());
}