在另一个项目中读取JSON文件时出现问题

时间:2019-02-16 22:11:29

标签: c# asp.net-core

在另一个项目中读取JSON文件的问题

伙计们,我在读取另一个项目中的某个Json文件时遇到了麻烦。我做了一个具有以下结构的示例项目。 Sample.UI.MVC,Sample.Infra.Data,Sample.Domain,Sample.Application。 在Sample.UI.MVC层中,我在Startup.cs文件中初始化Sample.Infra.Data项目中的类,该类在我的数据库中动态生成Seeds。但是,发生错误是因为EF Core试图在Sample.UI.MVC层而不是Sample.Infra.Data内部获取JSON文件。

我正在将Asp Net Core 2.2与VS Code一起使用 Seed \ Seed.cs

namespace Sample.Infra.Data.Seed
{
    public class Seed
    {
       private readonly DataContext _context;
       private readonly IHostingEnvironment hostingEnvironment;
       private readonly UserManager<Usuario> _userManager;

    public Seed(DataContext context, IHostingEnvironment hostingEnvironment)
    {
        _context = context;
        hostingEnvironment = hostingEnvironment;
        // _userManager = userManager;

    }

    public void SeedData()
    {

        try
        {
            // if (!_userManager.Users.Any())
            // {



            var userData =  File.ReadAllText($"json/UserSeedData.json");
                var users = JsonConvert.DeserializeObject<List<Usuario>>(userData);
                AddNewType(users);
            // }
            _context.SaveChanges();

        }
        catch (Exception ex)
        {

            Console.WriteLine($"erro: {ex.Message}");
        }
     }
   }
}

但是我得到了错误:

  

找不到路径的一部分
  'D:\ App \ projects \ csharp \ asp \ core \ Sample.UI.MVC \ json \ UserSeedData.json'。

代码Seed.cs:

Code Seed.cs

查看文件夹Json:

View Folder Json

2 个答案:

答案 0 :(得分:1)

这不是JSON问题,不是C#问题,也不是.Net Core 2x问题。

问题很简单:

Q:如果您尝试从相对路径读取文件,例如File.ReadAllText($"json/UserSeedData.json");,那么.exe会在哪里显示?

A:无论您的.exe从哪里运行,它都会尝试在目录“ json”下查找文本文件“ UserSeedData.json”。

建议:

在项目的appsettings.json中定义“ JSONDIR”变量设置,然后在调用File.ReadAllText()时将该路径附加到文件名中。

示例:

https://www.c-sharpcorner.com/article/setting-and-reading-values-from-app-settings-json-in-net-core/

另请参阅:

Sharing appsettings.json configuration files between projects in ASP.NET Core

答案 1 :(得分:1)

正在运行的项目(有Startup.cs的地方)Sample.UI.MVC,并且该文件应位于该目录中。但是我认为您可以充分利用该项目的整个过程,并且应该可以正常工作。

尝试找到一种方法来获取项目的完整路径,并在Sample.Infra.Data内部传递File.ReadAllText(...)目录路径。