2017-07-17 46 views
1

使用实体框架核心,有没有办法创建表,如果它还不存在?异常将抛出即使EnsureCreated是所谓的背景:创建一个表,它不存在?

DbSet<Ticker> Ticker { get; set } 
Database.EnsureCreated(); 

Ticker.Add(...); 
dbctx.SaveChanges(); <== exception 

结果异常:

System.Data.SqlClient.SqlException:无效的对象名称股票代码“

是有数据插入之前创建表Ticker的方法吗?

== ==编辑

这个问题是不是要创建/迁移整个数据库,该数据库总是存在的,它的大多数表还存在,但一些表可能不会。所以我只需要在运行时创建一个或两个表。

+0

的可能的复制[检查表存在于使用LINQ的数据库中](https://stackoverflow.com/questions/5218489/check-if-a-table-exists-within-a-database-using-linq) – Guy

+0

@Guy所以你建议有没办法做到这一点? – fluter

+0

我建议你可以检查表是否存在,如果不存在,就创建它。 – Guy

回答

0

是的,有。使用EFCore,一旦模型完成,您需要使用迁移来创建数据库。对于更详细的介绍,请看看这两个教程:

tutorial 1

tutorial 2

4

您在这里有几个选项。最简单的是做:

MyContext.Database.CreateIfNotExists(); 

或者说,它初始化的风格,通过把这个在您的上下文的构造函数:

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

这两种但是需要你每次你有时间手动删除您的架构修改你的模型并需要重新创建数据库。如果你不想做,你可以使用下面的初始化,而不是:

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

这将在每次运行程序时检查你的模型对数据库,并自动删除并重新创建数据库,如果该模型已被修改。

编辑:

如果你不想删除数据库,并只对其进行更新,那么你可以使用下面的初始化:

Database.SetInitializer<MyContext>(new MigrateDatabaseToLatestVersion<MyContext, Config>()); 
+1

我没有创建数据库,数据库始终存在,我只需要创建一个表,如果表不存在。 – fluter

+0

@fluter检查编辑。 – stybl

+1

谢谢,但是当我尝试你的例子时,EFCore中不存在'SetInitializer'方法:https://docs.microsoft.com/en-us/ef/core/api/microsoft.entityframeworkcore.infrastructure.databasefacade# Microsoft_EntityFrameworkCore_Infrastructure_DatabaseFacade – fluter

相关问题