habcerga1
@habcerga1

Как создать отношения или ключ в Fluent?

Добрый день, столкнулся с проблемой создания отношений при изучении 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 virtual ICollection<ProxyUserGroup> ProxyUserGroups { get; set; } = new List<ProxyUserGroup>();
        public string Name { get; set; }
    }


Потом сделал миграцию в БД (до этого делал руками таблицы но не смог побороть ошибку и решил сделать миграцию)
В таблице ProxyUserGroups:
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: Entity type 'ProxyUserGroup' has composite primary key defined with data annotations. To set composite primary key, use fluent API.

Но если зайти на сайт в режиме инкогнито то все нормально пока не пытаешся залогиниться и тогда выбрасывает:
InvalidOperationException: Entity type 'ProxyUserGroup' has composite primary key defined with data annotations. To set composite primary key, use fluent API.
+ User user = await userManager.FindByEmailAsync(model.Email); //ошибка еще тут

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

Войдите, чтобы написать ответ

Похожие вопросы