web-dev-qa-db-ja.com

コードファースト:エンティティを既存のデータベーステーブルにマッピングする

既存のデータベースでコードファーストでEntityFramework 6を​​使用していますが、エンティティをデータベーステーブルにマッピングする際に問題が発生します。

通常、私はデータベースファーストのアプローチを使用し、エンティティとコンテキストコードを生成しますが、デザイナーの使用は非常に困難になっています。

EFにスキーマを変更させたくないので、Database.SetInitializer(null)を設定しました。

データベーススキーマ:

enter image description here

コードファースト:

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 /データアノテーションを使用する必要がありますか?

14
Dave New

あなたは使用することができます

_[Table("Project")] 
public class Project {
....
}
_

プロジェクトエンティティに対する注釈、またはOnModelCreating(DbModelBuilder modelBuilder)modelBuilder.Entity<Project>().ToTable("Project");を呼び出すことができます。

どちらも同じことをします。

20
AlexC

ジェネリッククラスEntityTypeConfiguration(T)から継承するクラス(つまり:ProjectMap)を定義する必要があります。ここで、TはここではProjectクラスです。このProjectMapクラスでは、テーブルマッピングを明示的に定義できます。

this.ToTable("Project", "dbo");

クラスProjectMapは、DbContextクラスの次のメソッドで呼び出す必要があります

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new ProjectMap());
}
9
user3041160