[英]Entity Framework Core tools when building a repository
我正在尝试在数据存储库中使用Entity Framework Core,但是我很难让EF创建数据库。
在EF的先前版本中,它全部自动发生,如果在第一次尝试对数据执行任何操作时不存在,则EF创建数据库。
现在,我在文档中似乎有使用EF迁移的指令。 说明是安装依赖项和工具:
要运行dotnet ef migrations add MigrationName
与dotnet ef database update
一起dotnet ef migrations add MigrationName
。
现在来了。 当我正在构建一个存储库时,我有一个项目AppName.Data
,其中存储库被实现,一个项目AppName.WebApi
,其中存储库被使用。
如果我尝试添加工具并从AppName.Data
运行dotnet ef
它不起作用,因为AppName.Data
是一个库。 错误消息表明该工具只能在一个可执行应用程序的上下文中使用。
接下来的尝试是从AppName.WebApi
运行dotnet ef
,这是可执行的。 现在dotnet ef
工作但是如果我尝试使用dotnet ef migrations add InitialMigration
来创建数据库我得到一个错误,因为DbContext
不在AppName.WebApi
项目上,而是在另一个项目上。
我真的不知道该怎么做。 因此,如果我希望EF创建数据库和所有这些,并且我想使用存储库,那么可执行项目上没有EF特定代码 ,我该怎么办?
在搜索之后,我在文档上找到了“预览2已知问题”,这是目前工具的限制。 它确实需要一个可执行的应用程序项目才能运行,因为它需要使用dotnet run
。
文档还提供了解决方法。 我首选的并且对我有用的是第一个解决方法。 我们只是指向一个可执行的应用程序项目,它通过--startup-project
的路径传递--startup-project
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))
并运行控制台应用程序将重新创建(创建)数据库。
警告 :只有在数据库定期更改且数据可能丢失不那么重要的情况下,才在项目的早期阶段使用此代码。 切勿在生产中使用此代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.