Пользовательский контекст идентификации Asp


Я создаю одностраничное приложение, поэтому я использовал шаблон visual studio по умолчанию. Когда он был на разработке у меня было 2 базы данных Entityframework.МДФ и идентичность.mdf, потому что это то, что делает конфигурация по умолчанию, но теперь мне нужна связь с пользователями, и я не могу легко связаться с ними, потому что они находятся в другой базе данных.

В шаблоне MVC вы можете легко сделать это следующим образом:

public class ApplicationUser: IdentityUser
{
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }
    public DbSet<CustomTableItem> CustomTable{ get; set; } 
    //You can add more tables
}

Когда вы используете одностраничное приложение, оно настраивает управление пользователями в способ, которого я не понимаю.

UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());

Затем из этой статьи

Этот код использует конструктор по умолчанию для класса UserStore, который создаст новый экземпляр объекта IdentityDbContext, поскольку объект не указан. Если вы хотите использовать свой собственный производный класс IdentityDbContext, как это делает проект MVC 5, Вы можете изменить приведенный выше код инициализации и передать его в своем собственном контексте.

Он говорит, что я могу изменить его, но не показывает, как : (, и Я пытался, но у меня ничего не получается. Это то, что я пытаюсь сделать

UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>());

Что я за миссиг?

1 2

1 ответ:

Если вы используете конструктор по умолчанию (без параметров) для класса UserStore, это происходит:

public UserStore()
{
  this..ctor((DbContext) new IdentityDbContext());
  this.DisposeContext = true;
}

Identity framework создает собственный контекст базы данных для вас со строкой подключения по умолчанию и без связи с вашими собственными моделями или DbContext.

Скотт говорит в своей статье, что UserStore имеет конструктор, определенный следующим образом:

public UserStore(DbContext context)
{
  base..ctor(context);
}
Другими словами, вы можете ввести свой DbContext в качестве параметра в конструктор UserStore:
UserManagerFactory = () => new UserManager<ApplicationUser>(
    new UserStore<ApplicationUser>(new ApplicationDbContext()))

Где ApplicationDbContext определяется как вы описываете в вопросе.

Вам нужно будет создать миграцию на ApplicationDbContext, которая создаст таблицы идентификаторов в Entityframework.МДФ. Тогда вам придется переместить данные из Identity.mdf в вашу основную базу данных. Подключитесь к обеим базам данных и выполните примерно следующее:

insert into EntityFramework.dbo.IdenetityUsers
select * from Identity.dbo.IdentityUsers

Однако я выполнял миграцию данных из одной БД в другую только в пределах одного экземпляра SQL Server, а не между локальными базами данных (я предполагаю, что вы их использовали). Таким образом, этот метод может не сработать, и вам придется экспортировать данные из Identity.mdf в csv-файлы и импортировать их в EntityFramework.mdf