EF требуется определение ключа для отслеживания сущностей, даже если в таблице нет PK.В вашем случае у вас есть пара вариантов, если объединяющая таблица содержит только 2 FK.
Опция 1: многие ко многим без присоединения к сущности.Для этого вы сопоставляете коллекцию групп внутри пользователя (и, возможно, пользователей внутри группы), а затем устанавливаете связь HasMany.WithMany.Вы сообщаете EF о присоединяющейся таблице / столбцах и затем можете получить доступ к коллекциям без присоединяющегося объекта.Т.е.
public class User
{
// User columns...
public ICollection<Group> Groups { get; set; } = new List<Group>();
}
public class UserConfiguration : EntityTypeConfiguration<User>
{
public UserConfiguration()
{
ToTable("user");
HasKey(x => x.UserId)
.Property(x => x.UserId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasMany(x => x/Groups)
.WithMany() // if Group has no Users collection, otherwise .WithMany(x => x.Users)
.Map(x =>
{
x.ToTable("usertogroup");
x.MapLeftKey("userId");
x.MapRightKey("groupId");
});
}
}
Чтобы получить группы для пользователя: user.Groups;
Вариант 2: сопоставить объединяющуюся сущность (группу пользователей).Это необходимо, если в присоединяемой таблице есть дополнительные столбцы, например измененные столбцы отслеживания.В этом случае вы сопоставляете ключ в таблице для комбинации двух FK.
public class User
{
// User columns...
public virtual ICollection<UserToGroup> UserGroups { get; set; } = new List<UserToGroup>();
}
public class UserToGroup
{
public int UserId { get; set; }
public int GroupId { get; set; }
public virtual User User { get; set; }
public virtual Group Group { get; set; }
}
public class UserConfiguration : EntityTypeConfiguration<User>
{
public UserConfiguration()
{
ToTable("user");
HasKey(x => x.UserId)
.Property(x => x.UserId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasMany(x => x.UserGroups)
.WithRequired(x => x.User);
}
public class UserGroupConfiguration : EntityTypeConfiguration<UserGroup>
{
public UserGroupConfiguration()
{
ToTable("usertogroup");
HasKey(x => new { x.UserId, x.GroupId });
}
}
Это говорит EF, как сопоставить пользователя с ассоциацией группы.Могут быть случаи, когда вы хотите отобразить таблицу, для которой не определен PK.EF требует Ключ для отслеживания сущностей, поэтому в этих случаях вы используете ту же технику для обозначения всех необходимых столбцов, которые позволяют ему отличать одну строку от любой и все остальные.Если вы создаете ключ с набором столбцов, они должны быть уникальными в таблице, иначе вы получите неожиданные результаты.(например, чтение или запись неправильной строки в таблице.)
Чтобы получить группы для пользователя: user.UserGroups.Select(x => x.Group);