#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