C# 代码优先:将实体映射到现有数据库表
我首先对现有数据库使用EntityFramework6代码,但在将实体映射到数据库表时遇到问题 通常,我会使用数据库优先的方法并生成实体和上下文代码,但使用设计器已经成为一个巨大的难题 我已经设置了Database.SetInitializer(null),因为我不希望EF更改我的架构 数据库架构:C# 代码优先:将实体映射到现有数据库表,c#,.net,entity-framework,entity-framework-5,entity-framework-6,C#,.net,Entity Framework,Entity Framework 5,Entity Framework 6,我首先对现有数据库使用EntityFramework6代码,但在将实体映射到数据库表时遇到问题 通常,我会使用数据库优先的方法并生成实体和上下文代码,但使用设计器已经成为一个巨大的难题 我已经设置了Database.SetInitializer(null),因为我不希望EF更改我的架构 数据库架构: public class Project { public int ProjectId { get; set; } public string Name { get; set; }
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();
}
先编码:
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”,因为这在语义上是不正确的
问题:
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();
}
我是否必须使用fluent API/数据注释在项目数据库表和DbSet Projects
集合之间进行映射?您可以使用
[Table("Project")]
public class Project {
....
}
针对项目实体的注释,或者在OnModelCreating(DbModelBuilder-modelBuilder)
中,可以调用modelBuilder.entity().ToTable(“项目”)代码>
两者都可以做同样的事情。您应该定义一个类(即:ProjectMap
),该类继承自泛型类entitypeconfiguration(T)
,其中T
是您的项目
类。
在这个ProjectMap
类中,您可以明确定义一个表映射:
this.ToTable("Project", "dbo");
类ProjectMap
应该在DbContext
类的以下方法中调用
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ProjectMap());
}
这些是否会识别我的表键、约束和关系,或者我必须明确说明这些?我不知道。我认为键应该是可以的,因为您使用的是Entity+Id的约定,但是重新映射表可能会导致问题(对不起,IDK)。您的键有KeyAttribute注释,并且可以在ModelBuilder中映射这些注释和关系;表必须称为Projects soemthing出错,但正如您所说,您可以使用数据注释强制使用名称[table(“Projects”)]。在创建DBContext之前,尝试调用初始值设定项;把它放在外面的某个地方。由于提到了EntityTypeConfiguration
,它使每个模型的映射保持干净和分离。