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

.net c# entity-framework entity-framework-5 entity-framework-6

Вопрос

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

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

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

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

введите описание изображения здесь

Код-первых:

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

Вопрос:

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

Принятый ответ

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

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

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

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


Популярные ответы

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

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

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

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



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему