Entity Framework: System.ArgumentException: формат строки инициализации не соответствует спецификации, начиная с индекса 0 - PullRequest
0 голосов
/ 30 марта 2020

Я хочу обновить перенесенную базу данных на моем Asp. Net Core MVC приложении, но при попытке сделать это я получаю следующую ошибку:

Я уже пробовал несколько учебники или сообщения на форуме, но, к сожалению, это не сработало. Может ли кто-нибудь помочь мне, пожалуйста?

Это мой Startup.cs:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json.Serialization;
using PlaudertischSoftware.Models;
using Pomelo.EntityFrameworkCore.MySql;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.HttpOverrides;
using System.Net;
using Microsoft.AspNetCore.Http;

namespace PlaudertischSoftware
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
            services.AddRazorPages();
            services.AddMvc()
                .SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
            services.AddMvc(option => option.EnableEndpointRouting = false);
            services.AddDbContext<DatenbankKontext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("MyConnectionString")));
            services.AddControllersWithViews()
                .AddJsonOptions(options =>
                {
            options.JsonSerializerOptions.PropertyNamingPolicy = null;
                });
            services.Configure<ForwardedHeadersOptions>(options =>
            {
                options.KnownProxies.Add(IPAddress.Parse("0.0.0.0"));
            });

        }
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseStaticFiles();
            app.UseCookiePolicy();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
            app.UseForwardedHeaders(new ForwardedHeadersOptions
            {
                ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
            });

            app.UseAuthentication();
        }
    }
}

Вот мои Program.cs:

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Server.HttpSys;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using PlaudertischSoftware.Models;
using System.IO;

namespace PlaudertischSoftware
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
               .UseKestrel()
               .UseUrls("http://*:5000")
               .UseContentRoot(Directory.GetCurrentDirectory())
               .UseIISIntegration()
               .UseStartup<Startup>()
               .Build();

            host.Run();
        }
    }
}

Мой ContextFactory:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore.Infrastructure;
using PlaudertischSoftware.Models;

namespace PlaudertischSoftware
{
    public class DatenbankKontextFactory : IDesignTimeDbContextFactory<DatenbankKontext>
    {
        public DatenbankKontext CreateDbContext(string[] args)
        {
            var optionsBuilder = new DbContextOptionsBuilder<DatenbankKontext>();
            optionsBuilder.UseSqlServer("MyConnectionString");

            return new DatenbankKontext(optionsBuilder.Options);
        }
    }
}

Это мои настройки приложений. json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MyConnectionString": "Server=(localdb)\\mssqllocaldb;Database=MyConnectionString;Integrated Security=True"
  }
}

1 Ответ

0 голосов
/ 30 марта 2020

Я думаю, что проблема здесь:

    public DatenbankKontext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<DatenbankKontext>();

        optionsBuilder.UseSqlServer("MyConnectionString");
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

        return new DatenbankKontext(optionsBuilder.Options);
    }

То, что UseSqlServer ожидает фактическую строку подключения, и вы передаете ей строку "MyConnectionString", которая является только именем, которое вы вызвал вашу запись конфигурации строки подключения, но UseSqlServer не примет ее и go копается в ваших appsettings.connectionstrings в поисках чего-то с таким именем; он просто возьмет его, как если бы это была строка подключения, и попытается использовать ее

Я бы ожидал, что она будет больше похожа на вашу другую строку (в регистрации служб), которая:

optionsBuilder.UseSqlServer(Configuration.GetConnectionString("MyConnectionString"));

На самом деле, я даже не совсем уверен, что ваш DatenbankKontextFactory надеется сделать, а создатель DbContext, который вы уже зарегистрированы в DI, не делает? Если по какой-то причине вам нужен DbContext, а тот, который вам предоставил DI, не годится (неправильная область?), Вы можете попросить DI сделать вам другой, возможно, с другой областью действия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...