构建存储库时的实体框架核心工具

本文关键字:框架 核心 工具 实体 存储 构建 | 更新日期: 2023-09-27 17:58:13

我正试图在数据存储库中使用实体框架核心,但让EF创建数据库时遇到了问题。

在EF的早期版本中,这一切都是自动发生的,如果第一次尝试对数据执行任何操作时数据库不存在,EF就会创建数据库。

现在,我在文档中看到了使用EF迁移的说明。说明是安装依赖项和工具:

  • Microsoft.EntityFrameworkCore.Design
  • Microsoft.EntityFrameworkCore.Tools

并将dotnet ef migrations add MigrationNamedotnet ef database update一起运行。

现在事情来了。在构建存储库时,我有一个项目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

因此,与其运行

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); 
    }

要激活此代码并随意重新(创建)数据库,请在添加到包含数据存储库项目的解决方案中的控制台项目中使用此代码。

    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))

并运行控制台应用程序,数据库将被重新创建。

警告:只有当数据库定期更改并且潜在的数据丢失不那么重要时,才在项目的早期阶段使用此代码。永远不要在生产中使用此代码。