Удостоверение ASP.NET с MySQL вместо нулевой ссылки SQL Server - PullRequest
0 голосов
/ 30 сентября 2018

Я хочу использовать веб-API ASP.NET для работы с MySQL.Я выполнил шаги, описанные в:

https://docs.microsoft.com/en-us/aspnet/identity/overview/getting-started/aspnet-identity-using-mysql-storage-with-an-entityframework-mysql-provider

Итак, я сделал следующее:

  1. Установите соединитель mysql и создайте базу данных mysql локально черезверстак
  2. Добавить ссылку на mysql.data в проект
  3. Через менеджер nuget mysql.data.entity установить
  4. Конфигурация автоматически добавила провайдер mysql

Конфиг:

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
        <parameters>
            <parameter value="mssqllocaldb" />
        </parameters>
    </defaultConnectionFactory>
    <providers>
        <provider invariantName="System.Data.SqlClient" 
                  type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        <provider invariantName="MySql.Data.MySqlClient" 
                  type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.10.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
        </provider>
    </providers>
</entityFramework>

Я добавил класс MySqlInitializer:

public class MySqlInitializer : IDatabaseInitializer<ApplicationDbContext>
{
    public void InitializeDatabase(ApplicationDbContext context)
    {
        if (!context.Database.Exists())
        {
            // if database did not exist before - create it
            context.Database.Create();
        }
        else
        {
            // query to check if MigrationHistory table is present in the database 
            var migrationHistoryTableExists = ((IObjectContextAdapter)context).ObjectContext.ExecuteStoreQuery<int>(
              "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'IdentityMySQLDatabase' AND table_name = '__MigrationHistory'");

            // if MigrationHistory table is not there (which is the case first time we run) - create it
            if (migrationHistoryTableExists.FirstOrDefault() == 0)
            {
                context.Database.Delete();
                context.Database.Create();
            }
        }
    }
}

Я изменил ApplicationDbContext на:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    static ApplicationDbContext()
    {
        Database.SetInitializer(new MySqlInitializer());
    }

    public ApplicationDbContext()
      : base("DefaultConnection")
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

Моя строка подключения:

<connectionStrings>
    <add name="DefaultConnection" 
         connectionString="Database=IdentityMySQLDatabase;Data Source=localhost;User Id=root;Password=Admin!@#" 
         providerName="MySql.Data.MySqlClient" />
</connectionStrings>

Я использую расширенный клиент отдыха для тестирования API.Но когда я хочу зарегистрировать нового пользователя, я получаю нулевую ссылку.Это моя трассировка стека:

MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken (соединение DbConnection)

в соединении System.Data.Entity.Core.CommonDB)
в System.Data.Entity.Utilities.DbProviderServicesExtensions.GetProviderManifestTokenChecked (DbProviderServices providerServices, соединение DbConnection)
в System.Data.Entity.Infrastructure.DefaultManifestTokenD_play_Ob_0D_S_D_0_0_D_S_D_0_0_0_D_L_W_0_0_D_S_T_0_0_0_0_0_0_D_S_T_0_0_0_0_0_0_0_0_0_D_S_S_W_W_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_DB(Клавиша TKey, Func 2 valueFactory)<br> at System.Data.Entity.Infrastructure.DefaultManifestTokenResolver.ResolveManifestToken(DbConnection connection)<br> at System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection connection, DbProviderManifest& providerManifest)<br> at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)<br> at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)<br> at System.Data.Entity.Internal.RetryLazy 2.GetValue (вход TInput)
в System.Data.Entity.Internal.LazyInternalContext.InitializeContext ()
в System.Data.Entity.Internal.InternalContext.Initialize ()
в System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType (Type entityType)
в System.Data.Entity.Internal.Linq.InternalSet 1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet 1.get_InternalContext () в System.Data.Entity.Infrastructure.Источник DbQuery 1.System.Linq.IQueryable.get_Provider() at System.Data.Entity.QueryableExtensions.FirstOrDefaultAsync[TSource](IQueryable 1, источник Expression 1 predicate, CancellationToken cancellationToken) at System.Data.Entity.QueryableExtensions.FirstOrDefaultAsync[TSource](IQueryable 1, Expression 1 predicate) at Microsoft.AspNet.Identity.EntityFramework.UserStore 6.d__67.MoveNext () --- Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в Microsoft.AspNet.Identity.TaskExtensions.CultureAwaiter 1.GetResult() at Microsoft.AspNet.Identity.UserValidator 2.d__14.MoveNext () --- Конец трассировки стека из предыдущего местоположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача задачи) в Microsoft.AspNet.Identity.UserValidator 2.<ValidateAsync>d__13.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNet.Identity.UserManager 2.d__73.MoveNext () --- конец, где находится трассировка стекавозникла исключительная ситуация --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в Microsoft.AspNet.Identity.UserManager 10).при тестированииMYSQL.Controllers.AccountController.d__20.MoveNext () в D: \ Projects Visual Studio \ Private \ TestMYSQL \ TestMYSQL \ Controllers \ AccountController.cs: строка 333 --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение ---в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в System.Threading.Tasks.TaskHelpersExe.трассировка из предыдущего местоположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в System.Web.HttlerAConv.Convert.Control.In.d__1.MoveNext () --- Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) вSystem.Web.Http.Controllers.ActionFilterResult.d__5.MoveNext () --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в System.Web.Http.Filters.AuthorizationFilterAttribute.d__3.MoveNext () --- Конец трассировки стека из предыдущего местоположения, где было сгенерировано исключение --- в System.Runvices.CilerTaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в System.Web.Http.Controllers.AuthenticationFilterResult.d__5.MoveNext, в котором было найдено исключение, из которого было получено исключение (---)Брошенный --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача задачи) в System.Web.Http.Dispatcher.HttpControllerDispatcher.d__15.MoveNext ()

Я что-то упустил?Любая помощь будет оценена.Я искал 2 дня и до сих пор не смог решить проблему.

Спасибо.

1 Ответ

0 голосов
/ 01 октября 2018

После исследования возможностей.Решение было проще, чем я думал.Если у кого-то возникла такая же проблема, вот что я сделал: - Добавить новый проект mvc с удостоверением для входа отдельных пользователей.- Установите пакет nuget Mysql.Data - Установите пакет nuget Mysql.Data.EntityFramework - Создайте собственную базу данных mysql и получите строку подключения.- Измените строку подключения и добавьте имя провайдера 'MySql.Data.MySqlClient'

. Запустите и зарегистрируйте имя пользователя, приложение создаст для вас базу данных в mysql.

Надеюсь, это хорошо поможет кому-токто сталкивался с такими же проблемами.

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