Можно ли напрямую ссылаться на таблицу «многие ко многим», используя структуру сущностей, сначала код - PullRequest
15 голосов
/ 21 марта 2012

Я использую структуру сущностей и моделирую отношение многие ко многим.

Я создал отношения между двумя объектами, используя свободный API (скажем, пользователи и группы):

this.HasMany(t => t.Users)
.WithMany(t => t.Groups)
.Map(
m =>
{
  m.ToTable("GroupMembers");
  m.MapLeftKey("Group_Id");
  m.MapRightKey("User_Id");
});

Это прекрасно работает, но я также хотел бы иметь возможность напрямую ссылаться на таблицу GroupMembers. Для этого у меня есть что-то вроде:

[Table("GroupMembers")]
public class GroupMember
{
    #region Properties

    /// <summary>
    /// Gets or sets the group.
    /// </summary>
    public virtual Group Group { get; set; }

    /// <summary>
    /// Gets or sets the Id of rht group.
    /// </summary>
    [Key]
    [Column("Group_Id", Order = 1)]
    public int GroupId { get; set; }

    /// <summary>
    /// Gets or sets the user.
    /// </summary>
    public virtual User User { get; set; }

    /// <summary>
    /// Gets or sets the Id of the user.
    /// </summary>
    [Key]
    [Column("User_Id", Order = 2)]
    public int UserId { get; set; }

    #endregion
}    

Однако при инициализации DbContext я получу следующую ошибку:

Указанная схема недействительна. Ошибки: (381,6): ошибка 0019: EntitySet «GroupUser» со схемой «dbo» и таблицей «GroupMembers» был уже определено. Каждый EntitySet должен ссылаться на уникальную схему и таблица.

Я полагаю, это связано с тем, что структура сущностей не осознает, что таблица GroupMembers, указанная в свободном API, и таблица сущностей GroupMembers фактически совпадают. Другими словами, если я удаляю свободный API-код, описывающий отношение «многие ко многим», я успешно могу инициализировать DbContext.

Могу ли я иметь таблицу «многие ко многим», на которую я также могу ссылаться напрямую?

Ответы [ 4 ]

12 голосов
/ 21 марта 2012

Нет, вы не можете. Если вы хотите иметь доступ к таблице соединения через отдельную сущность, вы должны заменить отношение многие ко многим двумя отношениями один ко многим и изменить свойства навигации в User и Group, чтобы они ссылались на * 1003. *:

public class Group
{
    public int GroupId { get; set; }
    public virtual ICollection<GroupMember> Members { get; set; }
}

public class User
{
    public int UserId { get; set; }
    public virtual ICollection<GroupMember> Members { get; set; }
}

modelBuilder.Entity<Group>()
    .HasMany(g => g.Members)
    .WithRequired(gm => gm.Group);

modelBuilder.Entity<User>()
    .HasMany(u => u.Members)
    .WithRequired(gm => gm.User);

Почему вы хотите эту GroupMember сущность? Он не имеет никакого делового значения и имеет только ссылки и ключи. Обычно вы можете получить и изменить любое содержимое таблицы соединений, написав запросы LINQ и используя Group и User DbSets / лица и их свойства навигации.

2 голосов
/ 20 октября 2016

Мы обошли это, создав представление, которое используется только для определения отношений.У нас были другие поля в таблице поиска, к которым нам нужно было получить доступ.

Представление просто выбирает поля соединения из таблицы поиска.

1 голос
/ 03 февраля 2017

Да, вы можете ... Если вы используете другой контекст .

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

0 голосов
/ 05 апреля 2015

Да, вы можете!Проверьте это .Также удалите сущность GroupMembers и коллекцию IDbSet.

...