Entity framework core 我能';t运行迁移(使用.net core 3.0和实体框架)
我的.Net核心版本是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>
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);
}
}