Расширение IdentityUser, конфликт стоимости внешнего ключа - PullRequest
0 голосов
/ 04 октября 2018

Я хочу использовать ASP.Net-Identity для управления пользователями.Для этого я хочу расширить класс IdentityUser несколькими атрибутами.

public class AppUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<AppUser> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        return userIdentity;
    } 

    public int Settings_ID { get; set; }
    public string Position { get; set; }
    public string CompanyName { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
[...]

Теперь в моем data context я хочу создать только одну таблицу для этой модели пользователя:

 public class AntContext : IdentityDbContext<AppUser>
{

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<AntContext>(null);
        modelBuilder.Entity<AppUser>().ToTable("AppUsers");
        base.OnModelCreating(modelBuilder);
    }
        public override IDbSet<AppUser> Users { get; set; }
[...]

Однако при попытке update-database я получаю сообщение об ошибке:

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_dbo.AppUsers_dbo.AspNetUsers_Id". The conflict occurred in database "C:\USERS\NEUMA\SOURCE\REPOS\MYANTON\MYANTON\APP_DATA\ASPNETDB.MDF", table "dbo.AspNetUsers", column 'Id'.

Я понимаю, что AspNetUsers - это таблица из IdentityUser, но каксоздать только одну таблицу, чтобы не было конфликтов?

Как правильно расширить класс IdentityUser и использовать его в контексте данных?

1 Ответ

0 голосов
/ 05 октября 2018

Решение состоит в том, чтобы не смешивать контексты.Поддерживать разделение проблем.Используйте сценарий миграции для Identity и создайте новый сценарий для бизнес-контекста (вашего контекста данных).

Добавьте таблицу Users в бизнес-контекст, который ссылается на имя или подпрограмму из IdentityContext.Пожалуйста, прочитайте мой ответ здесь для довольно похожего вопроса.

Кроме того, нет необходимости расширять таблицу ApplicationUser.Вы можете использовать AspNetUserClaims для добавления такого рода информации.С пользовательским типом:

new Claim("http://www.myapp.com/Firstname", "Firstname");

Или существующим WIF ClaimType :

new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname", "Lastname");

Что касается CompanyName, это может фактически быть частью бизнес-контекста.

...