Как использовать | DataDirectory |строка подстановки в appsettings.json с ядром asp.net? - PullRequest
0 голосов
/ 02 мая 2019

Я новичок в ядре asp.net, и задача, которую я хочу сделать, должна быть очень простой. Используя Visual Studio, я пытаюсь связать файл .mdf со своим проектом в качестве локальной базы данных. Поскольку я хочу, чтобы он работал на нескольких компьютерах, мне нужно найти путь к папке с данными в appsettings.json. Поэтому после некоторых исследований лучший способ сделать это - использовать строку подстановки | DataDirectory | .

Проблема заключается в том, что мой веб-сайт не может получить доступ к моему mdf-файлу таким образом, и он генерирует ArgumentException: "Неверное значение для ключа 'attachdbfilename'" . Хотя я нашел несколько тем по этой проблеме, ни один из них не ответил на мой вопрос.

Я уже пытался использовать полный путь, чтобы найти свой файл, и он работал, но, как я уже сказал, мне нужно найти его на нескольких компьютерах.

Вот Startup.cs и appsettings.json

Startup.cs :

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            string path = Path.Combine(Directory.GetCurrentDirectory(), "App_Data");
            AppDomain.CurrentDomain.SetData("DataDirectory", path);

            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));
            services.AddDefaultIdentity<IdentityUser>()
                .AddEntityFrameworkStores<ApplicationDbContext>();

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }
        [...]
   }

Моя строка подключения, в appsettings.json :

"ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;AttachDbFilename=|DataDirectory|\\aspnet-MatrixCalculatorApp-db.mdf;Trusted_Connection=True;MultipleActiveResultSets=true"
  },

При необходимости я также могу предоставить трассировку стека.

Заранее благодарю за помощь.

1 Ответ

1 голос
/ 03 мая 2019

Ну, если у кого-то все еще есть та же проблема, что и у меня, я просто нашел решение:

Вы можете просто заменить вхождение строки на путь к вашей папке данных.

Startup.cs :

string path = Path.Combine(Directory.GetCurrentDirectory(), "App_Data");

            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection").Replace("[DataDirectory]", path)));
            services.AddDefaultIdentity<IdentityUser>()

appsettings.json

"DefaultConnection": "Server=(localdb)\\mssqllocaldb;AttachDbFilename=[DataDirectory]\\aspnet-MatrixCalculatorApp-db.mdf;Trusted_Connection=True;MultipleActiveResultSets=true"

Я заменил | DataDirectory | с [DataDirectory] , чтобы избежать путаницы программы со строкой подстановки. Но если у кого-то есть лучшее объяснение, чем у меня, было бы неплохо сделать это.

...