我已经使用Entity Framework 6构建了一个应用程序,创建了一些从数据库中插入提取数据的方法,现在我想为生产和调试环境测试它。
为了确保一切正常,我的调试数据库应该删除我测试的所有数据,而我的生产应该保留其数据。
我有两个项目:MyApp.Database
和MyApp.Database.Test
,每个项目的app.config
文件都有一个连接字符串,程序加载如下:
public DatabaseContext() : base("name=MyDB")
{
System.Data.Entity.Database.SetInitializer<DatabaseContext>(new CreateDatabaseIfNotExists<DatabaseContext>());
}
和连接字符串,其中database
参数设置为MyProdDB
和MyTestDB
:
<connectionStrings>
<add name="MyDB" connectionString="Host=localhost;user id=myUser;password=myPassword;database=MyProdDB" providerName="Npgsql" />
</connectionStrings>
当我运行应用程序并运行测试时,我为每种类型的数据库获取了正确的连接字符串。
但是当我运行测试时出现错误:
42P01: relation "dbo.Tags" does not exist
。一条简单的消息,说我没有将我的数据迁移到我的测试数据库中。
但是如何将其迁移到测试数据库?
我尝试在Package manager Console
中选择测试项目,并运行以下命令:
PM> Add-Migration "Init"
No migrations configuration type was found in the assembly 'MyApp.Database.Test'. (In Visual Studio you can use the Enable-Migrations command from Package Manager Console to add a migrations configuration).
PM> Update-Database
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
No migrations configuration type was found in the assembly 'MyApp.Database.Test'. (In Visual Studio you can use the Enable-Migrations command from Package Manager Console to add a migrations configuration).
PM> Enable-Migrations
No context type was found in the assembly 'MyApp.Database.Test'.
我是否需要为DbContext
指定我自己的MyApp.Database.Test
课程,该课程几乎是MyApp.Database
的副本?
答案 0 :(得分:0)
如果您不需要DEV环境中的数据,只需删除数据库即可。您使用CreateDatabaseIfNotExists,因此它将使用最新架构创建新数据库。 更重要的是,您可以在配置文件中配置初始化程序。在PROD上使用CreateDatabaseIfNotExists inializer,在DEV上使用DropCreateDatabaseIfModelChanges。因此,如果模型将发生变化,您将不得不在PROD上使用迁移,但DEV将只删除数据库并再次创建。
示例:
<contexts>
<context type="Elmah.SqlServer.EFInitializer.ElmahContext, Elmah.SqlServer.EFInitializer">
<databaseInitializer type="Elmah.SqlServer.EFInitializer.ElmahDatabaseInitializer, Elmah.SqlServer.EFInitializer" />
</context>
</contexts>
或查看here