我正在使用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>
重命名为“Project”,因为这在语义上是不正确的。
问题:
我是否必须使用流畅的API /数据注释在 Project 数据库表和DbSet<Project> Projects
集合之间进行映射?
答案 0 :(得分:20)
您可以使用
[Table("Project")]
public class Project {
....
}
针对项目实体的注释,或OnModelCreating(DbModelBuilder modelBuilder)
中您可以调用modelBuilder.Entity<Project>().ToTable("Project");
的注释。
两者都会做同样的事情。
答案 1 :(得分:9)
您应该定义一个继承自通用类ProjectMap
的类(即:EntityTypeConfiguration(T)
),其中T
在此Project
类。
在此ProjectMap
类中,您可以显式定义表映射:
this.ToTable("Project", "dbo");
应使用ProjectMap
类
DbContext
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ProjectMap());
}