C# 构建存储库时的实体框架核心工具
我试图在数据存储库中使用EntityFrameworkCore,但在让EF创建数据库时遇到了麻烦 在早期版本的EF中,如果在第一次尝试对数据执行任何操作时数据库不存在,EF会自动创建数据库 现在,我在文档中看到了使用EF迁移的说明。有关安装依赖项和工具的说明:C# 构建存储库时的实体框架核心工具,c#,.net,entity-framework,entity-framework-core,.net-core,C#,.net,Entity Framework,Entity Framework Core,.net Core,我试图在数据存储库中使用EntityFrameworkCore,但在让EF创建数据库时遇到了麻烦 在早期版本的EF中,如果在第一次尝试对数据执行任何操作时数据库不存在,EF会自动创建数据库 现在,我在文档中看到了使用EF迁移的说明。有关安装依赖项和工具的说明: Microsoft.EntityFrameworkCore.Design Microsoft.EntityFrameworkCore.Tools 要运行dotnet ef迁移,请将MigrationName与dotnet ef数据库更
- Microsoft.EntityFrameworkCore.Design
- Microsoft.EntityFrameworkCore.Tools
dotnet ef迁移,请将MigrationName
与dotnet ef数据库更新一起添加
现在事情来了。在构建存储库时,我有一个项目AppName.Data
,用于实现存储库,还有一个项目AppName.WebApi
,用于使用存储库
如果我尝试添加工具并从AppName.Data
运行dotnet ef
,它将不起作用,因为AppName.Data
是一个库。错误消息表示该工具只能在一个可执行应用程序的上下文中使用
下一次尝试是从可执行的AppName.WebApi
运行dotnet ef
。现在dotnet ef
可以工作了,但是如果我尝试dotnet ef migrations添加InitialMigration
来创建数据库,我会得到一个错误,因为DbContext
不在AppName.WebApi
项目上,而是在另一个项目上
我真的不知道怎么做。因此,如果我希望EF创建数据库和所有这些,并且我希望使用存储库,这样在可执行项目上就没有EF特定的代码,我应该怎么做?在搜索之后,我在“Preview 2 Known Issues”(预览2已知问题)上发现,这是目前工具的一个限制。它确实需要一个可执行的应用程序项目才能运行,因为它需要使用dotnet-run
这些文档还提供了解决方法。我喜欢的并且对我有效的方法是第一个解决方法。我们只需指向一个可执行的应用程序项目,该项目通过带有项目路径的--startup project
所以与其跑
dotnet ef migrations add MigrationName
我们跑
dotnet ef --startup-project pathToProject migrations add MigrationName
并且一切正常。或者,在存储库中,您可以将以下代码添加到DbContext类中:
public InviteesDbContext(bool recreate = false)
{
if (recreate)
{
recreateDatabase(this);
}
}
private static void recreateDatabase(InviteesDbContext dbContext)
{
dbContext.Database.EnsureDeleted();
dbContext.Database.EnsureCreated();
setPermissions(dbContext);
seed(dbContext);
}
要激活此代码并随意重新(创建)数据库,请在添加到包含datarepository项目的解决方案的控制台项目中使用此代码
static void Main()
{
using (InviteesDbContext dbContext = new InviteesDbContext(false))
{
Console.WriteLine("Database in existence or created");
Invitee invitee = dbContext.Invitees.Where(i => i.Id == 1).SingleOrDefault();
if (invitee != null)
{
Console.WriteLine("Invitee " + invitee.Id.ToString() + " found !!");
}
Console.ReadKey();
}
}
如果您暂时更改为
using (InviteesDbContext dbContext = new InviteesDbContext(true))
然后运行控制台应用程序,重新(创建)数据库
警告:仅当数据库定期更改且数据的潜在丢失不太重要时,才在项目的早期阶段使用此代码。请勿在生产中使用此代码 在PackageManager控制台中,指向applicationdbcontext所在的项目,然后运行它。