Можно ли использовать новую идентификацию Asp.net с Database First и EDMX? Или сначала только с кодом?
Вот что я сделал:
1) Я создал новый проект MVC5, и новая идентификация создала новые таблицы пользователей и ролей в моей базе данных.
2) Затем я открыл свой EDMX-файл Database First и перетащил в новую таблицу Identity Users, поскольку у меня есть другие таблицы, которые к ней относятся.
3) После сохранения EDMX генератор POCO Database First автоматически создаст класс User. Однако UserManager и RoleManager ожидают, что класс User наследуется от нового пространства имен Identity (Microsoft.AspNet.Identity.IUser), поэтому использование класса POCO User не будет работать.
Я предполагаю, что возможное решение - отредактировать мои классы генерации POCO, чтобы мой класс пользователя унаследовал от IUser?
Или ASP.NET Identity совместим только с Code First Design?
++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++
Обновление: следуя предложению Андерса Абеля ниже, я сделал это именно так. Это работает, но мне интересно, есть ли более элегантное решение.
1) Я расширил свой класс User объекта, создав частичный класс в том же пространстве имен, что и мои автоматически сгенерированные объекты.
namespace MVC5.DBFirst.Entity
{
public partial class AspNetUser : IdentityUser
{
}
}
2) Я изменил свой DataContext, чтобы он наследовал от IdentityDBContext вместо DBContext. Обратите внимание, что каждый раз, когда вы обновляете свой EDMX и повторно генерируете классы DBContext и Entity, вам придется вернуть это значение.
public partial class MVC5Test_DBEntities : IdentityDbContext<AspNetUser> //DbContext
3) В автоматически созданном классе сущности User вы должны добавить ключевое слово override в следующие 4 поля или закомментировать эти поля, поскольку они унаследованы от IdentityUser (шаг 1). Обратите внимание, что каждый раз, когда вы обновляете свой EDMX и повторно создаете классы DBContext и Entity, вам нужно будет вернуть это значение.
override public string Id { get; set; }
override public string UserName { get; set; }
override public string PasswordHash { get; set; }
override public string SecurityStamp { get; set; }
Ответы:
Должна быть возможность использовать систему идентификации с POCO и Database First, но вам нужно будет сделать пару настроек:
partial
. Это позволит вам предоставить дополнительную реализацию в отдельном файле.User
класса в другом файлеpartial User : IUser { }
Это заставит
User
класс реализовать правильный интерфейс, не касаясь фактических сгенерированных файлов (редактирование сгенерированных файлов всегда плохая идея).источник
Мои шаги очень похожи, но я хотел поделиться.
1) Создайте новый проект MVC5
2) Создайте новый Model.edmx. Даже если это новая база данных и в ней нет таблиц.
3) Отредактируйте web.config и замените сгенерированную строку подключения:
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-SSFInventory-20140521115734.mdf;Initial Catalog=aspnet-SSFInventory-20140521115734;Integrated Security=True" providerName="System.Data.SqlClient" />
с этой строкой подключения:
<add name="DefaultConnection" connectionString="Data Source=.\SQLExpress;database=SSFInventory;integrated security=true;" providerName="System.Data.SqlClient" />
После этого соберите и запустите приложение. Зарегистрируйте пользователя, и тогда таблицы будут созданы.
источник
РЕДАКТИРОВАТЬ: идентификация ASP.NET с базой данных EF First для шаблона проекта MVC5 CodePlex.
Я хотел использовать существующую базу данных и установить отношения с ApplicationUser. Вот как я сделал это с помощью SQL Server, но та же идея, вероятно, будет работать с любой БД.
:base("DefaltConnection")
чтобы использовать DbContext вашего проекта.Изменить: диаграмма классов идентичности Asp.Net
источник
IdentityUser
здесь бесполезен, потому что это объект с первым кодом, используемыйUserStore
для аутентификации. После определения моего собственногоUser
объекта я реализовал частичный класс, который реализует то,IUser
что используется этимUserManager
классом. Я хотел,Id
чтобыint
вместо строки был мой s, поэтому я просто возвращаю идентификатор пользователя toString (). Точно так же я хотелn
вUsername
быть записать строчными.public partial class User : IUser { public string Id { get { return this.UserID.ToString(); } } public string UserName { get { return this.Username; } set { this.Username = value; } } }
Вам это ни в коем случае не нужно
IUser
. Это всего лишь интерфейс, используемый платформойUserManager
. Поэтому, если вы хотите определить другой «IUser», вам придется переписать этот класс, чтобы использовать свою собственную реализацию.public class UserManager<TUser> : IDisposable where TUser: IUser
Теперь вы написать свой собственный ,
UserStore
который обрабатывает все хранилища пользователей, претензий, ролей и т.д. Реализовать интерфейсы все , что код-первыхUserStore
делает и измененияwhere TUser : IdentityUser
кwhere TUser : User
где «Пользователь» Ваш объект объектpublic class MyUserStore<TUser> : IUserLoginStore<TUser>, IUserClaimStore<TUser>, IUserRoleStore<TUser>, IUserPasswordStore<TUser>, IUserSecurityStampStore<TUser>, IUserStore<TUser>, IDisposable where TUser : User { private readonly MyAppEntities _context; public MyUserStore(MyAppEntities dbContext) { _context = dbContext; } //Interface definitions }
Вот пара примеров некоторых реализаций интерфейса.
async Task IUserStore<TUser>.CreateAsync(TUser user) { user.CreatedDate = DateTime.Now; _context.Users.Add(user); await _context.SaveChangesAsync(); } async Task IUserStore<TUser>.DeleteAsync(TUser user) { _context.Users.Remove(user); await _context.SaveChangesAsync(); }
Используя шаблон MVC 5, я изменил его,
AccountController
чтобы он выглядел так.public AccountController() : this(new UserManager<User>(new MyUserStore<User>(new MyAppEntities()))) { }
Теперь вход в систему должен работать с вашими собственными таблицами.
источник
Взгляните на этот проект на GitHub: https://github.com/KriaSoft/AspNet.Identity
Который включает в себя:
Также см . : Как создать поставщик Database-First для ADO.NET Identity.
источник
Хороший вопрос.
Я больше отношусь к базе данных от первого лица. Мне кажется, что парадигма «код прежде всего» кажется слабой, а «миграции» слишком подвержены ошибкам.
Я хотел настроить схему идентификации aspnet и не беспокоиться о миграции. Я хорошо разбираюсь в проектах баз данных Visual Studio (sqlpackage, data-dude) и знаю, как они неплохо справляются с обновлением схем.
Мое упрощенное решение:
1) Создайте проект базы данных, который отражает схему идентификации aspnet 2) используйте выходные данные этого проекта (.dacpac) в качестве ресурса проекта 3) разверните .dacpac при необходимости
Для MVC5 изменение
ApplicationDbContext
класса, похоже, помогает ...1) Реализовать
IDatabaseInitializer
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IDatabaseInitializer<ApplicationDbContext> { ... }
2) В конструкторе сигнализируйте, что этот класс будет реализовывать инициализацию базы данных:
Database.SetInitializer<ApplicationDbContext>(this);
3) Реализовать
InitializeDatabase
:Здесь я решил использовать DacFX и развернуть свой .dacpac
void IDatabaseInitializer<ApplicationDbContext>.InitializeDatabase(ApplicationDbContext context) { using (var ms = new MemoryStream(Resources.Binaries.MainSchema)) { using (var package = DacPackage.Load(ms, DacSchemaModelStorageType.Memory)) { DacServices services = new DacServices(Database.Connection.ConnectionString); var options = new DacDeployOptions { VerifyDeployment = true, BackupDatabaseBeforeChanges = true, BlockOnPossibleDataLoss = false, CreateNewDatabase = false, DropIndexesNotInSource = true, IgnoreComments = true, }; services.Deploy(package, Database.Connection.Database, true, options); } } }
источник
Я потратил несколько часов на работу над этим и наконец нашел решение, которым я поделился в своем блоге здесь . По сути, вам нужно сделать все, что сказано в ответе stink , но с одной дополнительной вещью: убедиться, что Identity Framework имеет определенную строку подключения SQL-Client поверх строки подключения Entity Framework, используемой для объектов вашего приложения.
Таким образом, ваше приложение будет использовать строку подключения для Identity Framework, а другую - для сущностей вашего приложения. Каждая строка подключения относится к разному типу. Прочтите мой блог, чтобы получить полное руководство.
источник
Я обнаружил, что у @ JoshYates1980 есть самый простой ответ.
После серии проб и ошибок я сделал то, что предложил Джош, и заменил
connectionString
сгенерированную строку подключения к БД. Изначально меня смутил следующий пост:Как добавить проверку подлинности ASP.NET MVC5 в существующую базу данных
В принятом ответе @Win указано, что нужно изменить
ApplicationDbContext()
имя соединения. Это немного расплывчато, если вы используете первый подход Entity и Database / Model, при котором строка подключения к базе данных создается и добавляется вWeb.config
файл.Имя
ApplicationDbContext()
подключения сопоставляется с подключением по умолчанию вWeb.config
файле. Таким образом, метод Джоша работает лучше всего, но дляApplicationDbContext()
большей читабельности я бы предложил изменить имя на имя вашей базы данных, как было первоначально опубликовано @Win, не забудьте изменитьconnectionString
для «DefaultConnection» вWeb.config
и закомментировать и / или удалить Entity сгенерированная база данных включает.Примеры кода:
источник
У нас есть проект DLL модели сущностей, в котором мы храним наш класс модели. Мы также ведем проект базы данных со всеми скриптами базы данных. Мой подход был следующим
1) Создайте свой собственный проект с EDMX, используя сначала базу данных
2) Создайте сценарий для таблиц в своей базе данных, я использовал VS2013, подключенный к localDB (подключения к данным), и скопировал сценарий в проект базы данных, добавьте любые настраиваемые столбцы, например, BirthDate [DATE] not null
3) Разверните базу данных
4) Обновите проект модели (EDMX) Добавить в проект модели
5) Добавьте любые настраиваемые столбцы в класс приложения
public class ApplicationUser : IdentityUser { public DateTime BirthDate { get; set; } }
В проект MVC AccountController добавлено следующее:
Поставщик удостоверений хочет, чтобы для него работала строка подключения SQL, чтобы сохранить только 1 строку подключения для базы данных, извлечь строку поставщика из строки подключения EF
public AccountController() { var connection = ConfigurationManager.ConnectionStrings["Entities"]; var entityConnectionString = new EntityConnectionStringBuilder(connection.ConnectionString); UserManager = new UserManager<ApplicationUser>( new UserStore<ApplicationUser>( new ApplicationDbContext(entityConnectionString.ProviderConnectionString))); }
источник