Entity Framework Core с идентификационными данными .Net 4.7 MVC - PullRequest
0 голосов
/ 29 июня 2018

Я хочу заменить 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?

Или у меня неправильный конец палки ...

Спасибо

1 Ответ

0 голосов
/ 22 февраля 2019

Я только что перестроил функциональность 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);
    }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...