EF 4.1 управляет отношениями «Многие ко многим» в EF CF

#entity-framework #mapping #many-to-many #entity-framework-4.1 #fluent-interface

#entity-framework #сопоставление #»многие ко многим» #entity-framework-4.1 #свободный интерфейс

Вопрос:

У меня есть две сущности с отношениями «многие ко многим», подобными этому:

 class author
{
  public int AuthorID{get;set;}
  public string Name{get;set;}
  public virtual ICollection<book> books{get;set;}
}
class book
{
  public int BookID{get;set;}
  public string Name{get;set;}
 public virtual ICollection<author> authors{get;set;}

}
  

и у меня есть промежуточная таблица с именем Bookauthor, определенная следующим образом:

   BookAuthor: int
  int AuthorID
  int BookID
  

Как отобразить это с помощью FluentAPI

Спасибо!!

Ответ №1:

С EDMX это было проблематично, но с EF 4.1 fluent API вы можете сопоставить это:

 modelBuilder.Entity<book>()
            .HasMany(b => b.authors)
            .WithMany(a => a.books)
            .Map(m => m.MapLeftKey("BookID")
                   .MapRightKey("AuthorID")
                   .ToTable("BookAuthor"));
  

Как вы можете видеть, я не сопоставляю BookAuthor столбец. Этот столбец неизвестен EF и должен быть автоматически увеличен.

Очевидно, что это не может работать с подходом «Сначала код», но только если вы используете Fluent API для существующей базы данных.

Комментарии:

1. это работает? неужели? при каком условии? 4.1 не заботится о переопределении OnModelCreating. Я действительно испытываю шок. ToTable(«BookAuthor») не создает таблицу, которая вызывается BookAuthor.

Ответ №2:

Я не думаю, что EF позволяет вам иметь отдельный идентификатор в таблицах соединений «многие ко многим».

Альтернативой является просто отображение BookAuthor как сущности.

Кстати, NHibernate поддерживает эту конструкцию с использованием idbag