我正在创建一个MVC应用程序,我经常添加新类。由于类彼此相关并且已经创建的表中的测试数据没有意义,我更喜欢使用AutomaticMigrations。
我使用以下命令将数据库设置为初始状态。
Update-Database –TargetMigration: $InitialDatabase
但问题是它总是不起作用。它出错的可能原因是什么?我不熟悉Code First Migrations。
在运行时声明DbContext已更改时,通常会抛出错误。在启用迁移之前,我确保现有表中没有与已删除表的依赖关系。我也收到一个错误说明
Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong.
我正在寻找有关该主题的一般帮助。
答案 0 :(得分:5)
首先,对于自动迁移,您应该在数据库上下文构造函数中设置Database Initializer。
public class YourDBContext: DbContext
{
public YourDBContext(): base("ConnectionString")
{
Database.SetInitializer<YourDBContext>(new CreateDatabaseIfNotExists<YourDBContext>());
}
您还可以使用重写种子方法创建实现CreateDatabaseIfNotExists<YourDBContext>
的自定义数据库初始化程序,以提供初始数据。
其次,您应该使用程序包管理器控制台Enable-Migrations -EnableAutomaticMigrations
然后,在程序包管理器控制台中使用Update-Database
命令将向数据库应用您在上次迁移后所做的所有挂起的更改。
更新:
使用Verbose
和update database命令查看生成的脚本
Update-Database –Verbose
答案 1 :(得分:1)
如果您需要一般帮助,我认为微软的documentation对初学者来说相当不错。他们还有一些很好的教程,可以让你从一开始就正确地开始。
对于您当前的问题,您能详细说明确切的问题吗?错误消息显示您需要自行修复的内容,而不一定是EF的问题。
<强>更新强>:
使用以下行修改自定义DbContext的构造函数:
Database.SetInitializer<MyDbContext>(null);
答案 2 :(得分:1)
如果您始终要重新创建数据库而不是定位初始数据库迁移,则应使用DropCreateDatabaseIfModelChanges
。有关asp.net website主题的更多信息
在上下文的构造函数中,例如
public class SchoolDBContext: DbContext
{
public SchoolDBContext(): base("SchoolDBConnectionString")
{
Database.SetInitializer<SchoolDBContext>(new DropCreateDatabaseIfModelChanges<SchoolDBContext>());
}