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

Я использую 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").

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


person DavidM    schedule 09.03.2014    source источник


Ответы (1)


Я думаю, что сопоставление может быть неправильным. При определении класса 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");
    }
person Suhas Joshi    schedule 10.03.2014
comment
Я сделал, как вы предложили, и теперь это работает. Ура! Большое спасибо, что нашли время помочь. - person DavidM; 12.03.2014
comment
Мне пришлось удалить свои миграции, таблицы в БД и попробовать это. Работает как шарм. Не знаю, почему во всех примерах, доступных в Интернете, использовались таблицы идентификации вместо пользовательских таблиц. - person aditya; 10.06.2018