Я хочу использовать веб-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
Итак, я сделал следующее:
- Установите соединитель mysql и создайте базу данных mysql локально черезверстак
- Добавить ссылку на
mysql.data
в проект - Через менеджер nuget
mysql.data.entity
установить - Конфигурация автоматически добавила провайдер 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 дня и до сих пор не смог решить проблему.
Спасибо.