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

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数据库更

我试图在数据存储库中使用EntityFrameworkCore,但在让EF创建数据库时遇到了麻烦

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

现在,我在文档中看到了使用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所在的项目,然后运行它。