代码优先:将实体映射到现有数据库表

我使用entity framework6代码优先与现有数据库,但在将我的实体映射到数据库表时遇到问题。

通常,我会使用数据库优先方法并生成我的实体和上下文代码,但使用设计器已经成为一个巨大的痛苦。

我已经设置了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(null); } public DbSet Projects { get; set; } } 

调用代码:

 using(var context = new ReleaseControlContext()) { var projects = context.Projects.ToList(); } 

抛出以下exception:

SqlException:无效的对象名称’dbo.Projects’。

这是因为我的数据库表是Project而不是Projects 。 我不想将我的上下文的DbSet重命名为“Project”,因为这在语义上是不正确的。

题:

我是否必须使用流畅的API /数据注释来在Project数据库表和DbSet Projects集合之间进行映射?

你可以使用

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

针对Project实体的注释,或者在OnModelCreating(DbModelBuilder modelBuilder)您可以调用modelBuilder.Entity().ToTable("Project");

两者都会做同样的事情。

您应该定义一个inheritance自generics类EntityTypeConfiguration(T)的类(即: ProjectMap ),其中T是您的Project类。 在此ProjectMap类中,您可以显式定义表映射:

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

应该在DbContext类的以下方法中调用类ProjectMap

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