В вашем листинге кода есть одна ошибка. Атрибут [ForeignKey]
может быть добавлен в свойство внешнего ключа или свойство навигации, но если в свойстве Navigation его необходимо указать, указав имя поля FK.(PokemonTypeId)
Два варианта поддержки нескольких типов покемонов: если у покемона может быть 1 или 2, но не более 2 типов, то вы можете добавить две ссылки PokemonType на покемона.Например:
public int PrimaryPokemonTypeId { get; set; }
[ForeignKey("PrimaryPokemonTypeId")]
public virtual PokemonType PrimaryPokemonType { get; set; }
public int? SecondaryPokemonTypeId { get; set; }
[ForeignKey("SecondaryPokemonTypeId")]
public virtual PokemonType SecondaryPokemonType { get; set; }
Если вы можете сослаться на более чем 2 типа, вы можете принять отношение многие ко многим, а не отношение 1 ко многим.Вы можете ограничить число связанных типов в коде двумя, если хотите, но схема данных будет поддерживать любое количество типов для покемонов.
Покемон будет содержать коллекцию типов.Это означает введение таблицы ссылок.Т.е. PokemonTypePokemon.
Если это EF Core, вам нужно определить таблицу связывания:
public class Pokemon
{
// ... Pokemon fields...
public virtual ICollection<PokemonTypePokemon> PokemonTypes { get; set; } = new List<PokemonTypePokemon>();
}
public class PokemonType
{
// Classifications...
public virtual ICollection<PokemonTypePokemon> Pokemon { get; set; } = new List<PokemonTypePokemon>();
}
public class PokemonTypePokemon
{
public virtual Pokemon { get; set; }
public virtual PokemonType { get; set; }
}
Это потребует небольшой разводки в DbContext, чтобы связать таблицу связывания.В обработчике DbContext OnModelCreating ...
// EF Core
modelBuilder.Entity<Pokemon>()
.HasMany(x => x.PokemonTypes)
.WithOne(x => x.Pokemon)
.HasForeignKey("PokemonId");
modelBuilder.Entity<PokemonType>()
.HasMany(x => x.Pokemon)
.WithOne(x => x.PokemonType)
.HasForeignKey("PokemonTypeId");
Скорее всего, вам потребуется настроить PK для таблицы PokemonTypePokemon, чтобы использовать составной ключ для PokemonId & PokemonTypeId.
С EF6 выможет отображать HasMany().WithMany()
, не требуя карты присоединяющейся таблицы во многих случаях.Это должно дать вам некоторое представление о том, с чего начать с изменения отображения и присоединения к таблице.Сделайте немного гугл-фу на EF Many-to-Many, чтобы уточнить.