Entity framework core 我能';t运行迁移(使用.net core 3.0和实体框架)

Entity framework core 我能';t运行迁移(使用.net core 3.0和实体框架),entity-framework-core,entity-framework-migrations,.net-core-3.0,Entity Framework Core,Entity Framework Migrations,.net Core 3.0,我的.Net核心版本是3.0.100-preview6-012264。你可以问我为什么使用预览版。主要原因是使用GRPC(为此搭建脚手架)进行了有益的工作。现在我想在我的项目中使用实体框架。我有以下.csproj: <Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp3.0</TargetFramework>

我的.Net核心版本是
3.0.100-preview6-012264
。你可以问我为什么使用预览版。主要原因是使用GRPC(为此搭建脚手架)进行了有益的工作。现在我想在我的项目中使用实体框架。我有以下
.csproj

<Project Sdk="Microsoft.NET.Sdk.Web">

    <PropertyGroup>
        <TargetFramework>netcoreapp3.0</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <Protobuf Include="Protos\dashboard.proto" GrpcServices="Server" Generator="MSBuild:Compile" />
        <Protobuf Include="Protos\users.proto" GrpcServices="Client" Generator="MSBuild:Compile" />
        <Protobuf Include="Protos\anal.proto" GrpcServices="Client" Generator="MSBuild:Compile" />
        <Content Include="@(Protobuf)" />
        <None Remove="@(Protobuf)" />
    </ItemGroup>

    <ItemGroup>
        <PackageReference Include="DimaRabbitLogger" Version="1.3.3" />
        <PackageReference Include="Grpc.AspNetCore.Server" Version="0.1.22-pre1" />
        <PackageReference Include="Google.Protobuf" Version="3.8.0" />
        <PackageReference Include="Grpc.Tools" Version="1.21.0" PrivateAssets="All" />
        <PackageReference Include="Grpc.Core" Version="1.21.0" />

        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.0.0-preview6.19304.10" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.0.0-preview6.19304.10" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.0.0-preview6.19304.10" />
        <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.0.0-preview5" />

        <PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
        <PackageReference Include="System.Runtime.Serialization.Json" Version="4.3.0" />

    </ItemGroup>

</Project>
型号
工作区

public class Workspace
{
    public int WorkspaceId { get; set; }

    public string Name { get; set; }

    public List<WorkspaceApplication> WorkspaceApplications { get; set; }

}
和我的应用程序上下文:

public class ApplicationContext : DbContext
{
    private readonly string _connectionString;

    public DbSet<Workspace> Workspaces { get; set; }
    public DbSet<Application> Applications { get; set; }

    public ApplicationContext(IConfiguration configuration)
    {
        _connectionString = configuration.GetConnectionString("DashboardDb");
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseNpgsql(_connectionString, b => b.MigrationsAssembly("Dashboard"));
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<WorkspaceApplication>()
            .HasKey(x => new {x.WorkspaceId, x.ApplicationId});

        modelBuilder.Entity<WorkspaceApplication>()
            .HasOne(x => x.Workspace)
            .WithMany(x => x.WorkspaceApplications)
            .HasForeignKey(x => x.WorkspaceId);

        modelBuilder.Entity<WorkspaceApplication>()
            .HasOne(x => x.Application)
            .WithMany(x => x.WorkspaceApplications)
            .HasForeignKey(x => x.ApplicationId);
    }
}
公共类应用程序上下文:DbContext
{
私有只读字符串_connectionString;
公共数据库集工作空间{get;set;}
公共数据库集应用程序{get;set;}
公共应用程序上下文(IConfiguration配置)
{
_connectionString=configuration.GetConnectionString(“DashboardDb”);
}
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
{
optionsBuilder.UseNpgsql(_connectionString,b=>b.MigrationsAssembly(“仪表板”);
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.HasKey(x=>new{x.WorkspaceId,x.ApplicationId});
modelBuilder.Entity()
.HasOne(x=>x.Workspace)
.WithMany(x=>x.WorkspaceApplications)
.HasForeignKey(x=>x.WorkspaceId);
modelBuilder.Entity()
.HasOne(x=>x.Application)
.WithMany(x=>x.WorkspaceApplications)
.HasForeignKey(x=>x.ApplicationId);
}
}
我运行以下控制台命令:

dotnet ef迁移添加第一次迁移

并显示以下错误消息:

无法执行,因为找不到指定的命令或文件。 可能原因: *您键入的内置dotnet不正确。 *您计划运行.NET Core,但dotnet ef不存在。 *您想运行全局工具,但路径中指定的路径找不到具有此名称的dotnet前缀的可执行文件

这在.NETCore2.2中运行良好。问题在哪里

旧行为

在3.0之前,dotnet ef工具包含在.NET Core SDK中,可以从任何项目的命令行随时使用,无需额外步骤

新行为

从3.0开始,.NET SDK不包括dotnet ef工具,因此在使用它之前,必须将其作为本地或全局工具显式安装

要安装它,您可以运行以下操作:

dotnet工具安装--全局dotnet ef--版本3.0.0-*

然后您应该能够运行正常的ef核心命令,如
dotnet ef migrations add…

不要忘记在操作系统的
path
变量中添加dotnet工具的路径。例如,如果使用linux ubuntu和zsh作为shell,则必须在
.zshrc
文件中添加以下内容:


export PATH=$PATH:$HOME/.dotnet/tools

您的项目中有固定SDK版本的global.json文件吗?没有。它有什么帮助?目前,我的机器上有两个SDK版本(3.0和2.2)。但是当我在控制台中键入dotnet--version时,我看到了这个结果
3.0.100-preview6-012264
对不起,我读得很快,以为是别的什么东西。从3.0预览版4开始,您需要将其作为一个全局dotnet工具。查看我关于如何安装/使用它的答案。此命令告诉我
工具'dotnet ef'已经安装。
。但是我没有在全球范围内安装这个。运行migration命令会使我的问题出错(然后必须安装。运行
dotnet工具列表
列出本地安装的工具,或运行
dotnet工具列表--global
列出全局安装的工具。检查
ef
是否在其中任何一个工具中。如果是,则需要卸载。它会给我
dotnet ef 2.2.4 dotnet ef
。这与我的.net 2.2 S有冲突吗DK?(我的机器上有两个版本的SDK 2.2和3.0.100-preview6)。如何解决这一冲突?是的,这正是我所想象的。您以前已经安装了2.2.*
ef
作为全局工具,但您不需要它,因为它是SDK的一部分。您可以卸载它
dotnet tool卸载dotnet ef--global
,然后再次安装3.0。如果您需要在2.2 pr中使用
dotnet ef
项目,你可以在根目录中放一个
global.json
,它将使用2.2 SDK中包含的
ef
工具。奇怪。也许可以尝试关闭控制台并再次打开?我刚刚创建了一个新项目,使用最新的3.0 SDK和包'3.0.0-preview7.19362.6',效果很好。我还安装了
dotnet ef
工具没有问题。
public class WorkspaceApplication
{
    public int ApplicationId { get; set; }
    public Application Application { get; set; }

    public string WorkspaceId { get; set; }
    public Workspace Workspace { get; set; }
}
public class ApplicationContext : DbContext
{
    private readonly string _connectionString;

    public DbSet<Workspace> Workspaces { get; set; }
    public DbSet<Application> Applications { get; set; }

    public ApplicationContext(IConfiguration configuration)
    {
        _connectionString = configuration.GetConnectionString("DashboardDb");
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseNpgsql(_connectionString, b => b.MigrationsAssembly("Dashboard"));
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<WorkspaceApplication>()
            .HasKey(x => new {x.WorkspaceId, x.ApplicationId});

        modelBuilder.Entity<WorkspaceApplication>()
            .HasOne(x => x.Workspace)
            .WithMany(x => x.WorkspaceApplications)
            .HasForeignKey(x => x.WorkspaceId);

        modelBuilder.Entity<WorkspaceApplication>()
            .HasOne(x => x.Application)
            .WithMany(x => x.WorkspaceApplications)
            .HasForeignKey(x => x.ApplicationId);
    }
}