14

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

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

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

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

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 и не Проекты. Я не хочу переименовывать мой контекст DbSet<Project> в «Проект», потому что это было бы семантически неправильно.

Вопрос:

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

+0

Я wonderung, почему он не работает ; Таблицу следует называть «Проекты», но все же, как вы сказали, вы можете использовать аннотацию Data для создания имени [Таблица («Проекты»)]. –

+0

попробуйте вызвать инициализатор перед созданием DBContext; Поместите его где-нибудь снаружи. –

ответ

18

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

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

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

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

+0

Будет ли кто-нибудь из них распознавать ключи таблицы, ограничения и отношения или мне нужно явно указать это? – davenewza

+0

Не знаю. Я бы подумал, что ключи * должны быть в порядке, по тому факту, что вы используете соглашение Entity + Id, но переназначение таблиц * может * вызывать проблемы (извините IDK). У вас есть аннотация KeyAttribute для ваших ключей, и есть возможность сопоставить их и ваши отношения в построителе моделей. – AlexC

9

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

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

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

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

Упрощенный для упоминания 'EntityTypeConfiguration', сохраняет отображения чистыми и разделенными для каждой модели. –

Смежные вопросы