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());
}