От многих до многих сопоставление с дополнительными полями в Fluent API

У меня много отношений, и я хочу хранить дополнительные данные в таблице пара, используя API Code First Fluent.

Как это можно достичь?

Моя модель:

Пользователь может иметь 1 или более значков (необязательно), значок может принадлежать одному или нескольким пользователям (необязательно). Я хочу сохранить дополнительное поле (называемое B) для сохранения этого отношения. Таблицу следует называть UserBadges со следующими полями: UserId, BadgeId, B

(Я видел это ранее в StackOverflow здесь, но я модель несколько сложная, и ответа не было дано правильно)

Ответ 1

Вы не можете сопоставить его как много-ко-многим. Если вы добавите дополнительное поле в таблицу переходов и хотите получить доступ к этому полю в приложении, вам необходимо продвинуть свою таблицу соединений в сущность и использовать два отношения "один ко многим":

public class Badge {
    ...
    public virtual ICollection<UserBadge> UserBadges { get; set; }
}

public class User {
    ...
    public virtual ICollection<UserBadge> UserBadges { get; set; }
}

public class UserBadge {
    public int UserId { get; set; }
    public int BadgeId { get; set; }
    public string B { get; set; }
    public virtual Badge Badge { get; set; }
    public virtual User User { get; set; }
}

Соглашения по умолчанию должны правильно определять отображение, за исключением ключа для таблицы UserBadge, которое должно быть выполнено либо в Fluent-API, либо в аннотациях данных.

modelBuilder.Entity<UserBadge>().HasKey(e => new { e.UserId, e.BadgeId });