Я пытаюсь создать отношения многие ко многим с ядром EF. Это мои 2 записи:
public class DbCharacter : DbEntity
{
public string CharName { get; set; }
public ICollection<DbCharacterSkill> Skills { get; set; }
}
public class DbSkill : DbEntity
{
public string SkillName { get; set; }
}
public class DbCharacterSkill : DbEntity
{
public int CharacterId { get; set; }
public int SkillId { get; set; }
public DbCharacter Character { get; set; }
public DbSkill Skill { get; set; }
}
public class DatabaseContext : DbContext
{
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Many to many relations.
modelBuilder.Entity<DbCharacterSkill>().HasKey(x => new { x.CharacterId, x.SkillId });
modelBuilder.Entity<DbCharacterSkill>().HasOne(pt => pt.Character).WithMany(p => p.Skills).HasForeignKey(pt => pt.CharacterId);
}
}
Это должно работать, но я получаю исключение, пока Update-Database
: не удалось выполнить команду DbCommand (26ms) [Parameters = [] , CommandType = 'Text', CommandTimeout = '30 '] CREATE TABLE CharacterSkill
(CharacterId
int NOT NULL, SkillId
int NOT NULL, Id
int NOT NULL AUTO_INCREMENT, CONSTRAINT PK_CharacterSkill
ПЕРВИЧНЫЙ КЛЮЧ (CharacterId
, SkillId
), ОГРАНИЧЕНИЕ FK_CharacterSkill_Characters_CharacterId
ИНОСТРАННЫЙ КЛЮЧ (CharacterId
) ССЫЛКИ Characters
(Id
) НА УДАЛЕННЫЙ КАСКАД, ОГРАНИЧЕНИЕ FK_CharacterSkill_Skills_SkillId
ИНОСТРАННЫЙ КЛЮЧ (SkillId
) ССЫЛКИ Skills
(Id
) НА УДАЛЕННОМ КАСКАДЕ); MySql .Data.MySqlClient.MySqlException (0x80004005): неверное определение таблицы; может быть только один автоматический столбец, и он должен быть определен как ключ
Очевидно, что только Id может быть первичным ключом, поскольку он автоматически увеличивается. Но все учебники, которые я читал, говорили, что я должен написать что-то вроде modelBuilder.Entity<DbCharacterSkill>().HasKey(x => new { x.CharacterId, x.SkillId });
.
ВОПРОС: Что произойдет, если я не использую HasKey? Или как правильно подходить ко многим ко многим и MySQL?