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

时间:2016-07-22 20:29:04

标签: c# .net entity-framework entity-framework-core .net-core

我正在尝试在数据存储库中使用Entity Framework Core,但是我很难让EF创建数据库。

在以前的EF版本中,它全部自动发生,如果第一次尝试对数据执行任何操作时,EF创建了数据库。

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

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

dotnet ef migrations add MigrationName一起运行dotnet ef database update

现在来了。在我构建存储库时,我有一个项目AppName.Data,其中存储库已实现,项目AppName.WebApi存储了存储库。

如果我尝试添加工具并从dotnet ef运行AppName.Data,则无效,因为AppName.Data是一个库。错误消息表明该工具只能在一个可执行应用程序的上下文中使用。

下一次尝试是从dotnet ef运行AppName.WebApi,这是可执行的。现在dotnet ef有效,但如果我尝试dotnet ef migrations add InitialMigration来创建数据库,我会收到一个错误,因为DbContext不在AppName.WebApi项目上,而在另一个项目上。

我真的不知道该怎么做。因此,如果我希望EF创建数据库和所有这些,并且我想使用存储库,那么在可执行项目上没有特定代码,我该怎么办?

2 个答案:

答案 0 :(得分:1)

在搜索完之后,我已经在the docs找到了"预览2已知问题"这是目前工具的限制。它确实需要一个可执行的应用程序项目才能运行,因为它需要使用dotnet run

文档还提供了解决方法。我首选的并且对我有用的是第一个解决方法。我们只是指向一个可执行应用程序项目,将--startup-project与项目路径一起传递。

所以不要运行

dotnet ef migrations add MigrationName

我们运行

dotnet ef --startup-project pathToProject migrations add MigrationName

一切都按预期工作。

答案 1 :(得分:0)

或者在您的存储库中,您可以将以下代码添加到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))

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

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