如何在 ASP.NET Core 3.1 中找到 bin 目录?

moh*_*sen 5 c# entity-framework-core asp.net-core

我的 EF 项目在一个项目中,而我的 ASP.NET Core 项目在另一个项目中,

D:\AspProjects\DatabaseHafez> <=== 我的 ef 模型在这个文件夹中

D:\AspProjects\Hafez> <=== 我的aspnet core 3 在这个文件夹中

所以每个项目都有一个 bin 文件夹。

下面的构建器(ConfigurationBuilder)应该有用于读取连接字符串的 appsettings.json 文件的路径。所以下面有这个路径 =>

D:\AspProjects\DatabaseHafez\bin\Debug\netcoreapp3.1\appsettings.json

但是我的 asp.net 核心项目中的 appettins.json 文件因此在构建后将复制到输出文件夹 =>

D:\AspProjects\Hafez\bin\Debug\netcoreapp3.1\appsettings.json

那么如何找到输出文件夹路径?

public class AppDbContextFactory : IDesignTimeDbContextFactory<AppDbContext>
{
    AppDbContext IDesignTimeDbContextFactory<AppDbContext>.CreateDbContext(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

        IConfigurationRoot configuration = builder.Build();

        var optionsBuilder = new DbContextOptionsBuilder<AppDbContext>();

        optionsBuilder.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));

        var context = new AppDbContext(optionsBuilder.Options);

        context.Database.EnsureCreated();
        return context;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想添加迁移但出现错误

D:\AspProjects\DatabaseHafez>dotnet ef migrations add changed98112601  

Build started...  
Build succeeded.  
Run Code Online (Sandbox Code Playgroud)

System.IO.FileNotFoundException: 未找到配置文件“appsettings.json”并且不是可选的。物理路径是“D:\AspProjects\DatabaseHafez\bin\Debug\netcoreapp3.1\appsettings.json”。

在 Microsoft.Extensions.Configuration.FileConfigurationProvider.HandleException(ExceptionDispatchInfo info)
在 Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload)
在 Microsoft.Extensions.Configuration.FileConfigurationProvider.Load()
在 Microsoft.Extensions.Configuration.ConfigurationRoot.. ctor(IList 1 工厂)1 providers)
at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
at DatabaseHafez.AppDbContextFactory.Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<DatabaseHafez.AppDbContext>.CreateDbContext(String[] args) in D:\AspProjects\DatabaseHafez\AppDbContextFactory.cs:line 27
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContextFromFactory(Type factory)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.<>c__DisplayClass13_1.<FindContextTypes>b__9()
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func

Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType) 中的)
在 Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType) 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType) 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor .AddMigration.<>c__DisplayClass0_0.<.ctor>b__0() 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.b__0() 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)

未找到配置文件“appsettings.json”,该文件不是可选的。物理路径是“D:\AspProjects\DatabaseHafez\bin\Debug\netcoreapp3.1\appsettings.json”。

现在我想知道如何找到bin我的 ASP.NET Core 项目的文件夹?

jen*_*ent 8

对于.net core,您可以使用PlatformServices.Default.Application.ApplicationBasePathnuget pkgMicrosoft.Extensions.PlatformAbstractions

这适用于任何运行时,无论是 Web 应用程序还是测试运行时。

从 .Net5+ 使用AppContext.BaseDirectory它取代上面的内容。

请参阅https://learn.microsoft.com/en-us/dotnet/api/system.appcontext.basedirectory?view=net-7.0#system-appcontext-basedirectory


Ath*_*ras 7

试着把它写成这样:

var runDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) 
Run Code Online (Sandbox Code Playgroud)

GetCurrentDirectory可能也有用,但这里有这个错误:https : //github.com/dotnet/project-system/issues/589所以我会避免它。


Dus*_*ush 5

您需要获取当前目录。

Directory.GetParent(typeof(Program).Assembly.Location).FullName;
Run Code Online (Sandbox Code Playgroud)

这将返回正确的目录。