EF 4 Code First:使用现有表格

时间:2012-01-18 10:58:54

标签: entity-framework-4.1 ef-code-first

我的数据库中有一个现有的表,我想使用Code First / Fluent API创建一些额外的表(无论你想怎样对它进行分类)。以下是我的DbContext

public class MyContext : DbContext
{
    public DbSet<Entity1> Entities1 { get; set; }
    public DbSet<Entity2> Entties2 { get; set; }

    public MyContext() : base(@"data source=....;")
    {}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer(new MyContextInitializer());
        modelBuilder.Conventions.Remove<IncludeMetadataConvention>();

        modelBuilder.Configurations.Add(new Entity1Configuration());
        modelBuilder.Configurations.Add(new Entity2Configuration());
    }
}

在这里讨论了一些问题和一些博客文章之后,我发现建议创建不存在的表:

public class MyContextInitializer : CreateDatabaseIfNotExists<MyContext>
{
    protected override void Seed(MyContext context)
    {
        context.Database.ExecuteSqlCommand(_mainTable);
        context.Database.ExecuteSqlCommand(_relationTable);
        base.Seed(context);
    }
    private readonly string _mainTable=@"create table ...";
    private readonly string _relationTable=@"create table ...";
}

但是Seed中的MyContextIntializer方法未调用,可能是数据库已经存在。如果我将ExecuteSqlCommand语句移至OnModelCreating中的MyContext语句,我会收到以下错误:

The context cannot be used while the model is being created.

除了在SQL Management Studio中直接运行SQL以创建表外,还有什么其他选择?

2 个答案:

答案 0 :(得分:1)

描述

几个月前我也做过同样的事情。

您可以将模型映射到现有数据库。 Scott Guthrie在博客上写过这篇文章。

我建议您使用 Enity Framework Power Tools 从现有数据库中创建模型和上下文。

更多信息

更新

您必须为DbContext设置初始化程序,如果不这样做,则不会使用新的初始化程序。在应用程序启动时执行以下操作。

Database.SetInitializer<MyContext>(new MyContextInitializer());

答案 1 :(得分:0)

您是否启用了迁移?如果没有,那就是可能的原因。你有一个Migrations文件夹,该文件夹是否有配置文件?构造函数是什么样的?这应该是什么样的:

    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }