Перемещение модели Identity ASP.NET в библиотеку классов
Я пытаюсь переместить модель Identity в библиотеку классов, используя методы в этой ссылке:
ASP.NET Identity в библиотеке служб
Проблема 1: Кажется, что она использует строку подключения к проекту веб-сайта. Я преодолел это, указав полную строку соединения в библиотеке классов. Могу ли я заставить IdentityDbContext использовать строку подключения библиотеки классов?
Проблема 2: Из-за проблемы 1, если я удаляю Entity Framework из проекта веб-сайта. Это приведет к следующей ошибке: он ищет EF SqlClient в проекте веб-сайта.
Исключение типа "System.InvalidOperationException" произошло в EntityFramework.dll, но не было обработано в коде пользователя
Дополнительная информация: Поставщик ADO.NET не найден провайдер Entity Framework с инвариантным именем "System.Data.SqlClient". Убедитесь, что провайдер зарегистрирован в разделе "entityFramework" файла конфигурации приложения. Подробнее см. http://go.microsoft.com/fwlink/?LinkId=260882.
Другие решения приветствуются до тех пор, пока в проекте веб-сайта не будут удалены все ссылки уровня доступа к данным, такие как EF.
Ответы
Ответ 1
Чтобы переместить IdentityModel в библиотеку классов (что правильно делать в соответствии с SRP), выполните следующие действия:
- Создайте библиотеку классов. (ClassLibrary1)
- Используя NuGet, добавьте ссылку на Microsoft.AspNet.Identity.EntityFramework. Это также автоматически добавит некоторые другие ссылки.
- Добавьте ссылку на свой сайт в ClassLibrary1
- Найдите WebSite/Models/IdentityModel.cs и переместите его в ClassLibrary1.
-
Сделайте IdentityModel.cs следующим образом:
public class ApplicationUser : IdentityUser
{
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("YourContextName")
{
}
}
-
Убедитесь, что на вашем веб-сайте Web.config есть значение YourContextName, указывающее на правильную базу данных в этом разделе. (Примечание: эта база данных может и должна содержать данные вашего приложения).
<add name="YourContextName" connectionString="YourConnectionStringGoesHere"
providerName="System.Data.SqlClient" />
-
Сделайте класс EF Context наследованием из вашего ApplicationDbContext:
public class YourContextName : ApplicationDbContext
{
public DbSet<ABizClass1> BizClass1 { get; set; }
public DbSet<ABizClass2> BizClass2 { get; set; }
// And so forth ...
}
Когда кто-либо на вашем сайте пытается войти в систему или зарегистрироваться, система Identity отправит их в вашу базу данных со всеми вашими данными, которые включают таблицы Identity.
Хорошо идти!
Ответ 2
Обновление для ответа @Rap для EF6 и Identity 2.0:
- Создайте библиотеку классов. (ClassLibrary1)
- Используя NuGet, добавьте ссылку на Microsoft.AspNet.Identity.EntityFramework и Microsoft.AspNet.Identity.Owin.
- Добавьте ссылку на свой сайт в ClassLibrary1
- Найдите WebSite/Models/IdentityModel.cs и переместите его в ClassLibrary1.
-
IdentityModel.cs должен выглядеть так, не нужно ничего менять:
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
// Add custom user claims here
return userIdentity;
}
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
-
Убедитесь, что на вашем веб-сайте Web.config есть контекст, указывающий на правильную базу данных в этом разделе. (Примечание: эта база данных может и должна содержать данные вашего приложения).
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=localhost;Initial Catalog=Project;Integrated Security=sspi;Pooling=false;" providerName="System.Data.SqlClient" />
</connectionStrings>
-
Сделайте класс EF Context наследованием из вашего ApplicationDbContext:
public class YourContextName : ApplicationDbContext
{
public DbSet<ABizClass1> BizClass1 { get; set; }
public DbSet<ABizClass2> BizClass2 { get; set; }
// And so forth ...
}
Ответ 3
Что вы понимаете, переместив Identity в библиотеку классов? для использования в качестве ссылки? У меня есть пользовательский пользовательский менеджер и пользователь в отдельной библиотеке, но это все.
Идентификационный материал требует некоторого хранилища данных. Если вы настроите Identity для использования EF, обязательно получите для него дополнительный пакет nuget, и вы должны будете передать строку соединения при создании контекста.
Сверху моей головы...
var mgr = new UserManager<ApplicationUser>(
new IUserStore_ofYourChoice<ApplicationUser>(
new DbContextName("ConnectionStringOverload"));
Я думаю, что хранилище EF является "UserStore", должно быть проверено.
В настоящее время существует около десятка различных пакетов nuget для хранилищ данных для Identity. Вам не нужно использовать EF, но для этого требуется некоторый запас.
** РЕДАКТИРОВАТЬ **
Кроме того, в качестве ссылки он всегда будет использовать конфигурацию и, следовательно, ее определенные строки подключения основного проекта по умолчанию, то, как он должен работать, так что это нормально.
Ответ 4
Есть несколько правил, которые вы должны знать и помнить.
Во-первых, веб-проект ВСЕГДА и ТОЛЬКО использует файлы web.config, которые он находит в своем собственном проекте. Неважно, что вы добавили в любой другой файл конфигурации в другом месте вашего решения. Веб-проект может ТОЛЬКО использовать то, что он находит в своем собственном проекте. Если у вас есть строка подключения в другом проекте, вы должны реплицировать ее в веб-проект, иначе ее никогда не будет найдено.
Во-вторых, если веб-проект является вашим проектом запуска и предполагая, что вы используете миграцию данных (поскольку Identity использует его), обратите внимание, что менеджер пакетов AlWAYS использует строку подключения, которую он находит в стартовом проекте. Следовательно, менеджер пакетов для базы данных обновлений не будет использовать строку подключения в вашем проектном проекте.
Простое решение:
1. Скопируйте строку соединения из проекта модели в свой веб-проект.
2. В консоли диспетчера пакетов убедитесь, что раскрывающийся список для выбора контекста указывает на ваш проект модели.
Ответ 5
Вопрос 1: -
Я думаю, можно использовать решение, найденное по ссылке ниже: -
Настройка платформы Entity Framework для строки динамического соединения
Вопрос 2: -
Я считаю, что инфраструктура сущности создает способ, когда время выполнения будет использовать web.config этого проекта. Инструкция от Microsoft также предполагает, что
http://msdn.microsoft.com/en-us/library/vstudio/cc716677(v=vs.100).aspx
Ответ 6
Пожалуйста, взгляните на проект, который я загрузил в Github. https://github.com/giorgos07/AspNet.Identity.AdoNetProvider Он содержит 2 проекта: библиотека классов, имеющих реализацию ASP.NET Identity (с использованием ADO.NET) в качестве отдельного проекта и Приложение ASP.NET MVC, демонстрирующее, как использовать Identity. Надеюсь, это поможет вам.