Code-first: сопоставление объектов с существующими таблицами базы данных

Я использую Entity Framework 6 в первую очередь с существующей базой данных, но имею проблемы с отображением моих объектов в таблицы базы данных.

Как правило, я бы использовал подход, основанный на базе базы данных, и создавал код сущности и контекста, но использование дизайнера стало огромной болью.

Я установил Database.SetInitializer(null), так как я не хочу, чтобы EF менял мою схему.

Схема базы данных:

enter image description here

Code-первых:

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", потому что это было бы семантически неверно.

Вопрос:

Нужно ли использовать текущие аннотации API/данных для сопоставления между таблицей базы данных проекта и коллекцией DbSet<Project> Projects?

Ответы

Ответ 1

Вы можете использовать

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

аннотации к объекту Project или в OnModelCreating(DbModelBuilder modelBuilder) вы можете вызвать modelBuilder.Entity<Project>().ToTable("Project");.

Оба будут делать то же самое.

Ответ 2

Вы должны определить класс (т.е.: ProjectMap), который наследует от общего класса EntityTypeConfiguration(T), где T - это ваш класс Project. В этом классе ProjectMap вы можете явно определить отображение таблицы:

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

Класс ProjectMap должен быть вызван следующим методом вашего класса DbContext

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