Как создать связь или первичный ключ с Fluent API в asp.core? - PullRequest
0 голосов
/ 16 февраля 2019

Добрый день, я столкнулся с проблемой создания отношений при изучении asp.core, сделал регистрацию и авторизацию на сайте через Identity и сделал классы:

public class User : IdentityUser
{ 
    [Key]
    public string Id { get; set; }
    public IEnumerable<User> Pupils { get; set; }
    public int SubLevel { get; set; }
    public int Score { get; set; }

    public virtual ICollection<ProxyUserGroup> ProxyUserGroups { get;set; } = new List<ProxyUserGroup>(); 
}


 [Table("ProxyUserGroups")]
 public class ProxyUserGroup 
 {
    [Key]
    [Column(Order = 0)]
    public string UserId { get; set; }
    [ForeignKey("UserId")]
    public virtual User User { get; set; }

    [Key]
    [Column(Order = 1)]
    public int UserGroupId { get; set; }
    [ForeignKey("UserGroupId")]
    public virtual UserGroup UserGroup { get; set; } 
 }


 [Table("UserGroups")]
 public class UserGroup 
 {
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }

    public virtual ICollection<ProxyUserGroup> ProxyUserGroups { get; set; } = new List<ProxyUserGroup>();
 }

Затем я выполнил миграциюв базу данных (до этого я сделал руками таблицы, но не смог преодолеть ошибку и решил выполнить миграцию)

Таблица ProxyUserGroup

 create table ProxyUserGroups (
 UserId nvarchar(450) not null
 constraint FK_ProxyUserGroups_User_UserId
 references AspNetUsers on delete cascade,
 UserGroupId int not null
 constraint FK_ProxyUserGroups_UserGroups_UserGroupId
 references UserGroups on delete cascade,
 constraint PK_ProxyUserGroups
 primary key (UserId, UserGroupId),
 constraint AK_ProxyUserGroups_UserGroupId_UserId
 unique (UserGroupId, UserId) )

Таблица UserGroups

create table UserGroups (
Id int identity
constraint PK_UserGroups
primary key,
Name nvarchar(max) )

И контекст

 protected override void OnModelCreating(Microsoft.EntityFrameworkCore.ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ProxyUserGroup>()
            .HasKey(t => new { t.UserId, t.UserGroupId });

        modelBuilder.Entity<ProxyUserGroup>()
            .HasOne<User>(e => e.User)
            .WithMany(t => t.ProxyUserGroups)
            .HasForeignKey(e => e.UserId);

        modelBuilder.Entity<ProxyUserGroup>()
            .HasOne<UserGroup>(e => e.UserGroup)
            .WithMany(t => t.ProxyUserGroups)
            .HasForeignKey(e => e.UserGroupId);
    }

После запуска сайта отображается:

InvalidOperationException: тип сущности 'ProxyUserGroup' имеет составной ключ, определенный с аннотациями данных.Чтобы установить составной первичный ключ, используйте свободный API.

Но если вы переходите на сайт в режиме инкогнито, то все в порядке, пока вы не попытаетесь войти в систему, а затем выбросить его:

InvalidOperationException: Тип сущности 'ProxyUserGroup' имеет составной ключ, определенный с аннотациями данных.Чтобы установить составной первичный ключ, используйте свободный API.

User user = await userManager.FindByEmailAsync (model.Email); // error is still here

Из первой ошибки я понял, что в modelBuilder.Entity ().HasKey (t => new {t.UserId, t.UserGroupId}); первичный ключ не генерируется (составной из двух внешних ключей), ноу второго все еще проблема с IdentityUser (чего раньше не было).Что именно не так и что нужно исправить?Заранее спасибо. (Простите за мой английский).

1 Ответ

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

Тип сущности 'ProxyUserGroup' имеет составной ключ, определенный с аннотациями данных.Чтобы установить составной первичный ключ, используйте свободный API.

Это связано с тем, что EF Core не поддерживает создание составного ключа с использованием атрибута Key.Вы должны использовать единственную функцию Fluent API HasKey() в EF Core.Поэтому удалите Key атрибуты из ProxyUserGroup класса следующим образом:

[Table("ProxyUserGroups")]
public class ProxyUserGroup
{
    public string UserId { get; set; }
    public virtual User User { get; set; }

    public int UserGroupId { get; set; }
    public virtual UserGroup UserGroup { get; set; } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...