EF Core Fluent API для отображения коллекции пользователей - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть класс уведомлений

public class Notification
{
    public int NotificationId { get; set; }

    public string NotificationMessage { get; set; }
    public DateTime NotificationSentOn { get; set; }

    //TODO: not sure how to map this in fluent api
    // a Notification can go to many users
    public ICollection<ApplicationUser> ReceivingUsers { get; set; }
}

и расширение ApplicationUser

public class ApplicationUser : IdentityUser
{
    public ApplicationUser()
    {
        IsAuthor = false;
    }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public Gender Gender { get; set; }
    public DateTime? DateOfBirth { get; set; }
    public DateTime RegisteredDate { get; set; }
    public bool IsAuthor { get; set; }

    // foreign key to UserProfile using the string ID from ApplicationUser
    public UserProfile MemberProfile { get; set; }
    // collection of notifications for this user
    public ICollection<Notification> Notifications { get; set; }
}

Вот ошибка, связанная со свойством Notifications в классе ApplicationUser

Невозможно определить отношение, представленное свойством навигации ApplicationUser.Notifications типа «ICollection».Либо настройте отношение вручную, либо игнорируйте это свойство, используя атрибут «[NotMapped]» или «EntityTypeBuilder.Ignore» в «OnModelCreating».

Я считаю, что отношение должно быть один-много,то есть одно Уведомление отправляется многим ApplicationUsers, но мой обычный шаблон в Entity Configuration не работает, я должен что-то упустить в одном из классов.

Я не уверен, как отобразить коллекцию Notification илиотношение Foreignkey к UserProfile с использованием свободно распространяемого API (я использую классы EntityConfiguration с использованием интерфейса IEntityTypeConfiguration)

Обновление Согласно ответу Camilo, я обновил свои конфигурации Entity Configuration, включив в них таблицу NavigationUser, в которой первичный ключ задан какследует

public class NotificationUserEntityConfiguration : IEntityTypeConfiguration<NotificationUser>
{
    public void Configure(EntityTypeBuilder<NotificationUser> builder)
    {
        builder.HasKey(u => new { u.ApplicationUserId, u.NotificationId })
            .HasName("PK_NotificationUser");

        builder.Property(u => u.NotificationId)
            .ValueGeneratedNever()
            .IsRequired();            

        builder.Property(u => u.ApplicationUserId)
            .ValueGeneratedNever()
            .IsRequired();

    }
}

Это вернуло следующее из скрипта создания базы данных

Он создал ForeignKey в таблице ApplicationUser

table.ForeignKey(                        name: "FK_AspNetUsers_Notifications_NotificationId",
        column: x => x.NotificationId,
        principalSchema: "MachineryCtx",
        principalTable: "Notifications",
        principalColumn: "NotificationId",
        onDelete: ReferentialAction.Restrict);

и ForeignKey в таблице NotificationUsers назадна уведомления

table.ForeignKey(                       name: "FK_NotificationUser_Notifications_NotificationId",
      column: x => x.NotificationId,
      principalSchema: "MachineryCtx",
      principalTable: "Notifications",
      principalColumn: "NotificationId",
      onDelete: ReferentialAction.Cascade);

1 Ответ

0 голосов
/ 24 декабря 2018

Вы пытаетесь смоделировать отношения «многие ко многим», как если бы они были отношениями «один ко многим».

Вместо этого у вас должно быть что-то вроде этого:

public class ApplicationUser
{
    ...
    public ICollection<NotificationUser> Notifications { get; set; }
}

public class Notification
{
    ...
    public ICollection<NotificationUser> Users { get; set; }
}

public class NotificationUser
{
    public int ApplicationUserId { get; set; }
    public int NotificationId { get; set; }

    public ApplicationUser User { get; set; }
    public Notification Notification { get; set; }
}

Этоговорит:

  • У пользователя может быть много уведомлений
  • В уведомлении может быть много пользователей

Вы можете иметь либо IDENTITY Первичный ключ, либоСоставной первичный ключ с ApplicationUserId,NotificationId

...