Ответ 1
Вы можете сделать это, указав связь явно с использованием Fluent API. Переопределите метод OnModelCreating()
вашего класса DbContext
, а в вашем переопределении укажите данные таблицы сопоставления следующим образом:
class MyContext : DbContext
{
public DbSet<Currency> Currencies { get; set; }
public DbSet<Country> Countries { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Country>()
.HasMany(c => c.Currencies)
.WithMany() // Note the empty WithMany()
.Map(x =>
{
x.MapLeftKey("CountryId");
x.MapRightKey("CurrencyId");
x.ToTable("CountryCurrencyMapping");
});
base.OnModelCreating(modelBuilder);
}
}
Обратите внимание, что в любом случае в моем быстром тесте вам нужно будет Include()
свойство Currencies при загрузке объекта EF для заполнения списка:
var us = db.Countries
.Where(x => x.Name == "United States")
.Include(x=>x.Currencies)
.First();
ИЗМЕНИТЬ
Если вы действительно хотите сделать все с помощью Data Annotations, а не использовать Fluent вообще, то вы можете моделировать таблицу соединений явно, как указано в другом месте. Однако существуют различные недостатки использования этого подхода, поэтому, по-видимому, наилучшим подходом является метод Fluent.
class Country
{
public int Id { get; set; }
public virtual ICollection<CountryCurrency> CountryCurrencies { get; set; }
}
class Currency
{
public int Id { get; set; }
}
class CountryCurrency
{
[Key, Column(Order=0)]
public virtual int CountryId { get; set; }
[Key, Column(Order=1)]
public virtual int CurrencyId { get; set; }
public virtual Country Country { get; set; }
public virtual Currency Currency { get; set; }
}