Идентификатор ASP.NET. Ошибка при изменении идентификатора пользователя. Тип основного ключа по умолчанию от строки до int. И при использовании имен пользовательских таблиц.

asp.net-identity ef-code-first entity-framework-6

Вопрос

Я использую Microsoft.AspNet.Identity 2.0.0-beta1 и Entity Framework 6.1.0-beta1 (выпущен 11 февраля 2014 г.).

Я получаю следующую ошибку, когда пытаюсь изменить тип первичного ключа идентификатора пользователя по умолчанию из строки в int И когда я пытаюсь использовать собственные имена таблиц (так что User.MyUsers вместо dbo.AspNetUsers):

« Сущности типа« IdentityUser »и« ApplicationUser »не могут обмениваться табличными« MyUsers », потому что они не находятся в иерархии одного типа или не имеют действительной связи один-один внешний ключ с соответствующими первичными ключами между ними ».

Я могу успешно изменить тип PK идентификатора пользователя по умолчанию из строки в int ИЛИ изменить имена имен идентификаторов по умолчанию, но я не могу обойти оба вместе, не ударяя эту ошибку.

Мое решение основано на:

1: Раздел «Сделать тип первичного ключа доступным для пользователей и ролей» на странице http://blogs.msdn.com/b/webdev/archive/2013/12/20/announcing-preview-of-microsoft-aspnet- identity-2-0-0-alpha1.aspx .

2: Как изменить имена таблиц при использовании Visual Studio 2013 ASP.NET Identity? ,

Мой фактический код:

using Microsoft.AspNet.Identity.EntityFramework;

namespace Musetone.Models
{
public class ApplicationUser : IdentityUser<int, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
}

public class CustomRole : IdentityRole<int, CustomUserRole>
{
    public CustomRole() { }
    public CustomRole(string name) { Name = name; }
}

public class CustomUserRole : IdentityUserRole<int> { }
public class CustomUserClaim : IdentityUserClaim<int> { }
public class CustomUserLogin : IdentityUserLogin<int> { }

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, CustomRole, int, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }

    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<IdentityUser>().ToTable("MyUsers", "User").HasKey(u => u.Id).Property(u => u.Id).HasColumnType("int");
        modelBuilder.Entity<ApplicationUser>().ToTable("MyUsers", "User").HasKey(u => u.Id).Property(u => u.Id).HasColumnType("int");
        modelBuilder.Entity<IdentityUserRole>().ToTable("MyUserRoles", "User").HasKey(r => new { r.RoleId, r.UserId }).Property(r => r.UserId).HasColumnType("int");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("MyUserLogins", "User").HasKey(l => new { l.UserId, l.LoginProvider, l.ProviderKey }).Property(l => l.UserId).HasColumnType("int"); 
        modelBuilder.Entity<IdentityUserClaim>().ToTable("MyUserClaims", "User").Property(c => c.UserId).HasColumnType("int"); 
        modelBuilder.Entity<IdentityRole>().ToTable("MyRoles", "User").HasKey(r => r.Id); 
    }
}
}

Я получаю эту ошибку, даже если я удалю HasColumnType («int»).

Любая помощь будет принята с благодарностью.

Принятый ответ

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

   protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<ApplicationUser>().ToTable("MyUsers");
        modelBuilder.Entity<CustomUserRole>().ToTable("MyUserRoles");
        modelBuilder.Entity<CustomUserLogin>().ToTable("MyUserLogins");
        modelBuilder.Entity<CustomUserClaim>().ToTable("MyUserClaims");
        modelBuilder.Entity<CustomRole>().ToTable("MyRoles");
    }


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему