【问题标题】:Code-first: Mapping entities to existing database tables代码优先:将实体映射到现有数据库表
【发布时间】:2013-11-27 13:27:53
【问题描述】:

我在现有数据库中使用 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&lt;Project&gt; 重命名为“Project”,因为这在语义上是不正确的。

问题:

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

【问题讨论】:

  • 我想知道为什么它不起作用;该表必须称为 Projects soemthing going wrong 但正如您所说,您可以使用数据注释来强制名称 [Table("Projects")]。
  • 在创建 DBContext 之前尝试调用初始化程序;把它放在外面的某个地方。

标签: c# .net entity-framework entity-framework-5 entity-framework-6


【解决方案1】:

你可以使用

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

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

两者都会做同样的事情。

【讨论】:

  • 这些是否可以识别我的表键、约束和关系,还是我必须明确说明这一点?
  • 我不知道。我原以为键应该没问题,因为您使用的是Entity+Id的约定,但是重新映射表可能会导致问题(抱歉IDK)。您的键确实有 KeyAttribute 注释,并且可以映射这些以及您在模型构建器中的关系。
【解决方案2】:

您应该定义一个继承自通用类EntityTypeConfiguration(T) 的类(即:ProjectMap),其中T 是您的Project 类。 在这个ProjectMap 类中,您可以显式定义一个表映射:

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

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

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

【讨论】:

  • 因提及 EntityTypeConfiguration 而被投票赞成,保持每个模型的映射清洁和分离。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 2011-08-08
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多