EF核心不在迁移方法上创建表
Posted
技术标签:
【中文标题】EF核心不在迁移方法上创建表【英文标题】:EF core not creating tables on migrate method 【发布时间】:2018-10-30 09:44:09 【问题描述】:嘿,我刚开始使用 EF 核心,一切正常。我调用了context.Database.Migrate()
方法,它创建了一个数据库。但即使我的上下文对象有一个DBSet<T>
,它也不会创建任何表,除了迁移历史记录。
谁能帮我解决这个问题?
【问题讨论】:
你给Add-Migration
打过电话吗?
是的,我做到了。但我仍然希望 db 由代码本身启动..
Add-Migration
生成代码,context.Database.Migrate()
使用该代码迁移它。
好的。但它仍然无法正常工作。在这两种情况下,它只是创建数据库。不是表格
【参考方案1】:
context.Database.Migrate()
本身不会生成迁移。相反,它会处理您创建的迁移。
对于每个数据库更改,您应该致电Add-Migration sensibleName
。
您的启动类将继续调用context.Database.Migrate()
,它将检查您的数据库并处理任何未完成的迁移。
例如,一旦您创建了数据库,一般规则是调用Add-Migration Initial
。调用context.Database.Migrate()
一次将检查您的数据库是否存在,如果不存在则创建它,检查是否应用了Initial
迁移,如果没有则应用它。
如果你随后调用Add-Migration SmallChange
,下次启动时也会发生同样的情况,类似于以下内容:
-
数据库是否存在?是的
是否已应用迁移初始值?是的
是否已应用迁移 SmallChange?没有
应用迁移 SmallChange
您的第一次迁移应该如下所示:
public partial class Initial : Migration
protected override void Up(MigrationBuilder migrationBuilder)
migrationBuilder.CreateTable(
name: "HelloWorld",
columns: table => new
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
MyString = table.Column<string>(nullable: true),
);
如果您的迁移看起来不是这样,则可能是您的 DbContext
配置不正确。如果您的表仍未被应用,请尝试从您的包管理器控制台运行数据库更新,看看 Update-Database -Verbose
到底发生了什么
【讨论】:
明白。但这就是我的观点。我创建了初始迁移。但是我的Up()
和Down()
方法是空的,没有生成表。
好的 - 在 SQL Server Management Studio(或您使用的任何工具)中,删除已创建的数据库。清除您的 Migrations 文件夹,然后再次尝试 Add-Migration Initial
。
所以现在它起作用了。如果我稍后在阶段添加 DBSetcontext.Database.Migrate()
方法与 Update-Database
同义 ? 现在您已经进行了初始迁移,对您的 DbContext
(或其中的模型)的任何更改都会创建一个差异迁移。我建议您现在试一试,更改型号并致电Add-Migration
看看会发生什么。 TLDR Add-Migration
始终是必需的,您的 c.Db.Migrate()
呼叫将应用它们!
EF 核心中是否有类似自动迁移的功能?【参考方案2】:
所以我与这个斗争了很长时间,但我无法弄清楚。我的迁移在应用程序项目中,而我的 DbContext 在另一个项目中。
在为要应用迁移的上下文创建选项时,需要指定 MigrationAssembly。
serviceCollection.AddDbContext<YourContext>(options => options.UseSqlServer(_configuration.GetConnectionString("ConnectionString"), b => b.MigrationsAssembly("Your.Assembly")));
【讨论】:
非常感谢。很好的答案。 经过一整天的斗争,这最终成为了我的答案!【参考方案3】:我做了以下工作:
-
擦除我的 APP 项目中的迁移文件夹。
站在 DataAccess 项目上,在那里我声明了持久性(EF、Dbcontext 等)
2.1 添加-迁移初始。
2.2 从控制台更新数据库。
【讨论】:
【参考方案4】:我将补充标记为正确的答案。就我而言,迁移不起作用,尽管一切都与上面的答案一样。 EF 工具更新帮助了我:dotnet tool update --global dotnet-ef
【讨论】:
仅供参考,对现有答案的补充应添加为 cmets 而不是新答案。 我知道,但我没有足够的声誉以上是关于EF核心不在迁移方法上创建表的主要内容,如果未能解决你的问题,请参考以下文章