#c# #many-to-many #entity-framework-4.1 #entity-relationship
#c# #многие ко многим #entity-framework-4.1 #сущность-отношение
Вопрос:
Привет, я пытаюсь использовать отношения «Многие ко многим» с EF Fluent API. У меня есть 2 класса POCO.
public class Project
{
public int ProjectId { get; set; }
public virtual ICollection<Author> Authors { get; set; }
public Project()
{
Authors = new List<Author>();
}
}
public class Author
{
public int AuthorId { get; set; }
public virtual ICollection<Project> Projects { get; set; }
public Author()
{
Projects = new List<Project>();
}
}
И я сопоставляю отношения «многие ко многим» с этой частью кода:
////MANY TO MANY
modelBuilder.Entity<Project>()
.HasMany<Author>(a => a.Authors)
.WithMany(p => p.Projects)
.Map(m =>
{
m.ToTable("ProjectAuthors");
m.MapLeftKey("ProjectId");
m.MapRightKey("AuthorId");
});
Это создало таблицу ProjectsAuthors в БД. Это моя первая попытка в этом случае сопоставления отношений.
Если я опустил это сопоставление, оно создало таблицу AuthorProject с аналогичной схемой. Это правильно или нет?
Комментарии:
1. @Ladislav: Ничего. Я спросил, является ли это обычным поведением EF, когда я создаю отношения «многие ко многим». Вы словак или Cezch ?
2. Да, я чех. Насколько я понимаю ваш вопрос, поведение правильное.
3. @Ladislav: Я прочитал несколько статей о EF в вашем блоге, хорошая работа 🙂
Ответ №1:
Методом проб и ошибок я обнаружил следующее. Даны два класса…
public class AClass
{
public int Id { get; set; }
public ICollection<BClass> BClasses { get; set; }
}
public class BClass
{
public int Id { get; set; }
public ICollection<AClass> AClasses { get; set; }
}
… и нет свободного сопоставления и DbContext, подобного этому…
public class MyContext : DbContext
{
public DbSet<AClass> AClasses { get; set; }
public DbSet<BClass> BClasses { get; set; }
}
…имя созданной таблицы соединений — BClassAClasses . Если я изменю порядок наборов…
public class MyContext : DbContext
{
public DbSet<BClass> BClasses { get; set; }
public DbSet<AClass> AClasses { get; set; }
}
…имя созданной таблицы соединений изменяется на AClassBClasses, а также изменяется порядок ключевых столбцов в таблице. Итак, имя таблицы соединений и порядок ключевых столбцов, по-видимому, зависят от порядка, в котором классы сущностей «загружаются» в модель, что может быть порядком DbSet
объявлений или другим порядком, если задействовано больше отношений — например, какой-либо другой объект, ссылающийся на AClass
.
В конце концов, это вообще не имеет значения, потому что такое отношение «многие ко многим» является «симметричным». Если вы хотите иметь собственное имя таблицы соединений, вы можете указать его в Fluent API, как вы уже делали.
Итак, на ваш вопрос: да, присвоение имени таблице соединений AuthorProjects
является правильным поведением. Если бы имя было ProjectAuthors
, это тоже было бы правильным поведением.