Entity Framework 4.1 Сначала код: многие ко многим с ICollection только для одного объекта

#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. Странно, пробовал это раньше, но не сработало. Похоже, база данных не была воссоздана… В любом случае ваше решение работает именно так, как должно. Спасибо!