我的数据库中有一个现有的表,我想使用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以创建表外,还有什么其他选择?
答案 0 :(得分:1)
您可以将模型映射到现有数据库。 Scott Guthrie在博客上写过这篇文章。
我建议您使用 Enity Framework Power Tools 从现有数据库中创建模型和上下文。
您必须为DbContext设置初始化程序,如果不这样做,则不会使用新的初始化程序。在应用程序启动时执行以下操作。
Database.SetInitializer<MyContext>(new MyContextInitializer());
答案 1 :(得分:0)
您是否启用了迁移?如果没有,那就是可能的原因。你有一个Migrations文件夹,该文件夹是否有配置文件?构造函数是什么样的?这应该是什么样的:
public Configuration()
{
AutomaticMigrationsEnabled = true;
}