【问题标题】:Entity Framework Core tools when building a repository构建存储库时的 Entity Framework Core 工具
【发布时间】:2016-07-22 20:29:04
【问题描述】:

我正在尝试在数据存储库中使用 Entity Framework Core,但我无法让 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 特定代码,我应该怎么做?

【问题讨论】:

  • 在包管理器控制台中,指向applicationdbcontext所在的项目,然后运行它。

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


【解决方案1】:

搜索后,我在the docs 的“Preview 2 Known Issues”上发现这是目前工具的限制。它确实需要一个可执行的应用项目才能运行,因为它需要使用dotnet run

文档还提供了解决方法。我更喜欢并且对我有用的是第一个解决方法。我们只需指向一个可执行的应用程序项目,通过 --startup-project 和项目的路径。

所以不要跑

dotnet ef migrations add MigrationName

我们跑

dotnet ef --startup-project pathToProject migrations add MigrationName

一切都按预期进行。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 2017-03-21
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多