0

У нас есть проект .NET Core, который использует Identity 3 и IdentityDbContext, используя EF Core для управления пользователями. Сгенерированные таблицы хранятся в общей базе данных SQL Server, которая также используется другим проектом в нашем решении, которое представляет собой .NET DataLayer .NET 4.5.2 Framework с использованием EF6.Как получить доступ к пользователям, когда проект Identity использует EF Core и Class Library использует EF6 с той же базой данных

(Только некоторые более фоне - проект .NET Ядро представляет собой сервер авторизации, который использует OpenIddict для реализации OpenIdConnect и oauth2 и настроен Идентичность, так что мы можем сохранить пользователей в базу данных и входа в систему и аутентификации)

Как только мы завершаем проверку подлинности, мы вызываем вызов к нашей конечной точке API. API работает с DataLayer, который работает с EF6. Из этого проекта мне нужно получить зарегистрированного пользователя и работать с пользователями для различных запросов. В идеале я хотел использовать и расширять ту же таблицу AspNetUsers.

Мне интересно, какой рекомендуемый подход здесь? Если я попытаюсь создать User DbContext в проекте EF6, я должен добавить новую миграцию, и строительные леса хотят создать новую таблицу - та, которая уже существует в базе данных. Я немного не уверен в том, что у меня есть два разных контекста в двух разных проектах и ​​как они могут «играть хорошо» вместе.

ответ

1

Я смог заставить это работать. Основная проблема заключается в том, что я просто хотел получить доступ к моей таблице AspNetUsers, которая была создана Identity 3 в проекте DotNet Core в моем проекте библиотеки классов DatNet 4.51 DataLayer.

Я достиг этого, создав класс Entity User.cs в проекте EF 6 библиотеки классов и убедившись, что его свойства соответствуют столбцам из класса ApplicationUser.cs, созданного Identity 3.

Пользователь.CS

 public class User{ 

    [Key] 
    public string Id { get; set; } 
    public int AccessFailedCount { get; set; } 
    public string ConcurrencyStamp { get; set; } 
    public string Email { get; set; } 
    public bool EmailConfirmed { get; set; } 
    public bool LockoutEnabled { get; set; } 
    public DateTimeOffset? LockoutEnd { get; set; } 
    public string NormalizedEmail { get; set; } 
    public string NormalizedUserName { get; set; } 
    public virtual string PasswordHash { get; set; } 
    public string PhoneNumber { get; set; } 
    public bool PhoneNumberConfirmed { get; set; } 
    public virtual string SecurityStamp { get; set; } 
    public bool TwoFactorEnabled { get; set; } 
    public string UserName { get; set; } 
} 

Затем я настроить EntityConfiguration для отображения в таблице AspNetUsers

UserConfiguration.cs

public class UserConfiguration : EntityTypeConfiguration<User> 
{ 
    public UserConfiguration() 
    { 
     ToTable("AspNetUsers"); 
    } 
} 

В моем классе DbContext я добавил DbSet для моего Пользователи лица:

public virtual IDbSet<User> Users { get; set; } 

Затем я выполнил команду Add-Migration для изменения изменений. После создания я прокомментировал код и применил переход к базе данных. Это создает строку в таблице __MigrationsHistory таблицы AspNetUsers, но не пытается воссоздать таблицу.

Я был тогда в состоянии успешно общаться с таблицей AspNetUsers из проекта DataLayer Ef6 :)

Кроме того, кажется, что я могу также расширить таблицу AspNetUsers с пользовательскими столбцами теперь, добавляя свойства моего User.cs класса и выполняет миграцию в проекте Datalayer EF6.

1

Недавно я применил подобный сценарий. Я следовал этому подходу.

У меня есть отдельная библиотека классов для уровня данных, в которой есть репозитории/хранилища, связанные с идентификацией, и DbContext. DbContext берет строку подключения из проекта-хозяина.

. Проект Core Core имеет строку подключения, указанную в appSettings.json. Эта строка подключения указывает на ту же базу данных. Этот проект реализует IdentityServer3 и действует как услуга Token.

.Net 4.5.2 проект имеет строку подключения, указанную в web.config. Это также указывает на ту же базу данных. Это приложение получает токен из проекта .net core и использует это Bearer Token для доступа к другим API.

Я создал еще один проект, чтобы поддерживать объекты, и этот проект ссылается как на .net core, так и на .net хостов.

Таким образом, у меня есть один общий уровень данных для двух хост-проектов и 2 разных уровня обслуживания/бизнеса для двух проектов-хозяев. Он работает хорошо для меня.

Как EF 7.0 не поддерживает посев, у меня есть консольное приложение для посева данных в базу данных. Даже это консольное приложение получает доступ к одной и той же базе данных через Data Layer.

Так 3 разных проекта получают доступ к одной и той же базе данных.

Я не могу публиковать свой код. Надеюсь, это поможет.

+0

Большое спасибо - так я правильно это понимаю ..... Проект .NET Core использует Identity 3, а для .NET .NET 3.5.2 установлен Identity 2? Идентификация 2 и 3 создает ApplicationDbContext - поэтому этот ApplicationDbContext находится в DataLayer? Затем оба этих проекта имеют ссылку на Datalayer (.Net 4.5.2), у которого есть DbContext, который простирается от ApplicationDbContext? Я немного смущен, потому что, насколько я понимаю, я думал, что Identity 3 и Identity 2 создают немного другую схему базы данных. – user1750537

+0

Моя основная проблема заключается в том, что я хочу, чтобы мой DataLayer .net 452 DbContext мог получить доступ к таблицам Identity, созданным основным проектом .NET, с Identity 3 – user1750537

+0

Идентификация 2 и 3 имеет небольшие изменения в схеме. Какую u можно преодолеть, создав базовый объект и получив его для другого объекта с дополнительными свойствами ... если вы хотите использовать одну и ту же базу данных для идентификаторов 2 и 3, тогда вам нужно, чтобы все столбцы в db .. проходили через объекты идентификации и решить, какие объекты u нужно поместить в db, чтобы другая версия идентификаторов подмножества этих столбцов. – Venky