Entity Framework Core с проблемами идентификации .Net 4.7 MVC

Я ищу замену EF6 на EF Core в проекте, который я только что начал создавать.

Проблема, с которой я столкнулся, заключается в том, что в настоящее время я наследую свой контекст от IdentityDbContext, например, используя Identity.

public partial class MyContext : IdentityDbContext<ApplicationUser>

Для перехода на EF Core необходимо использовать Identity Core. Это нормально для моего уровня доступа к данным, поскольку вместо этого я могу просто ссылаться на Microsoft.AspNetCore.Identity.EntityFrameworkCore.

Реальная проблема, которую я обнаружил, была при попытке использовать это в моем приложении MVC .Net 4.7, где Identity Core не будет работать, поскольку это не .Net Core.

Итак, мой лучший вариант - просто разделить Identity на отдельный контекст или есть способ, которым я могу использовать EF Core, как я сейчас, путем наследования IdentityContext, не используя Identity Core?

Или у меня совсем не тот конец палки ...

Спасибо


person kramms    schedule 28.06.2018    source источник
comment
А, разве вы не имеете в виду повышение до Identity4?   -  person johnny 5    schedule 29.06.2018
comment
Я пояснил, что нужно просто указать Identity Core, чтобы избежать путаницы.   -  person kramms    schedule 29.06.2018


Ответы (1)


Что я только что сделал, так это повторно реализовал функциональность из IdentityDbContext прямо в моем DbContext + предоставленных пользовательских хранилищах. На самом деле здесь нет никакой магии. Единственное, что делает IdentityDbContext, - это добавляет несколько наборов данных и некоторые сопоставления в ваш контекст.

Вы можете найти все необходимое здесь: https://github.com/aspnet/AspNetIdentity/tree/master/src/Microsoft.AspNet.Identity.EntityFramework

Мы используем Guids в качестве идентификаторов, потому что у нас уже были пользовательские классы, такие как CustomUserLogin, унаследованные от IdentityUserLogin, поэтому я просто переместил все из базового класса в этот класс.

Вы увидите, что старый код не имеет надлежащих свойств навигации в обоих направлениях. Я добавил это, чтобы можно было сопоставить следующее:

    private void SetupIdentityTables(ModelBuilder modelBuilder)
    {
        var user = modelBuilder.Entity<ApplicationUser>()
            .ToTable("AspNetUsers");
        user.HasMany(u => u.Roles).WithOne().HasForeignKey(ur => ur.UserId);
        user.HasMany(u => u.Claims).WithOne().HasForeignKey(uc => uc.UserId);
        user.HasMany(u => u.Logins).WithOne().HasForeignKey(ul => ul.UserId);
        user.Property(u => u.UserName)
            .IsRequired()
            .HasMaxLength(256);
        user.HasIndex(x => x.UserName).HasName("UserNameIndex").IsUnique();

        // CONSIDER: u.Email is Required if set on options?
        user.Property(u => u.Email).HasMaxLength(256);

        modelBuilder.Entity<CustomUserRole>()
            .ToTable("AspNetUserRoles")
            .HasKey(r => new { r.UserId, r.RoleId });

        modelBuilder.Entity<CustomUserLogin>()
            .ToTable("AspNetUserLogins")
            .HasKey(l => new { l.LoginProvider, l.ProviderKey, l.UserId });

        modelBuilder.Entity<CustomUserClaim>()
            .ToTable("AspNetUserClaims");

        var role = modelBuilder.Entity<CustomRole>()
            .ToTable("AspNetRoles");
        role.Property(r => r.Name)
            .IsRequired()
            .HasMaxLength(256);
        role.HasIndex(x => x.Name).HasName("RoleNameIndex").IsUnique();
        role.HasMany(r => r.Users).WithOne().HasForeignKey(ur => ur.RoleId);
    }

ПРИМЕЧАНИЕ. Этот код на самом деле работает некорректно из-за некоторых проблем с внешним ключом. Мне нужно будет еще раз взглянуть на сопоставления, но вы, по крайней мере, должны понять идею.

person Mikael Eliasson    schedule 21.02.2019