#entity-framework #mapping #many-to-many #ef-code-first #entity-framework-4.1
#entity-framework #сопоставление #многие ко многим #ef-code-first #entity-framework-4.1
Вопрос:
Учитывая эти классы, сначала используя код EF 4.1, это (по соглашению) приведет к соотношению «многие ко многим» между страницей и тегом:
public interface ITaggable
{
ICollection<Tag> { get; set; }
}
public class Page : ITaggable
{
public virtual ICollection<Tag> { get; set; }
}
public class Tag
{
public virtual ICollection<Page> { get; set; }
}
Поскольку у меня есть куча других классов, которые реализуют ITaggable
, мне пришлось бы добавить все эти коллекции в Tag
:
public class Tag
{
public virtual ICollection<Page> { get; set; }
public virtual ICollection<Post> { get; set; }
public virtual ICollection<Event> { get; set; }
...
}
Если я не включу эти свойства в Tag
, EF генерирует отношение «1 ко многим». Есть ли способ исключить ICollection<T>
on Tag
и в любом случае получить отношение многие ко многим?
(Примечание: ICollection<ITaggable>
вкл Tag
не работает.)
Ответ №1:
Вы должны использовать свободное сопоставление:
public interface ITaggable
{
ICollection<Tag> { get; set; }
}
public class Page : ITaggable
{
...
public virtual ICollection<Tag> Tags { get; set; }
}
public class Tag
{
...
}
public class Context : DbContext
{
public DbSet<Tag> Tags { get; set; }
public DbSet<Page> Pages { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Page>()
.HasMany(p => p.Tags)
.WithMany();
}
}
Комментарии:
1. Странно, пробовал это раньше, но не сработало. Похоже, база данных не была воссоздана… В любом случае ваше решение работает именно так, как должно. Спасибо!