Ответ 1
То, что вы получаете, является поведением EF Code First по умолчанию в отношении сопоставления ассоциации от 1 до многих к базе данных.
Например, у вас есть класс ICollection<File>
on Person, в результате EF создаст таблицу FK в файлах (PersonId) и сопоставит ее таблице Id PK on Persons.
Теперь я полагаю, что вам нравится иметь много-много отношений между файлом и личностью, так что каждый файл может относиться ко многим Лицам, и каждый человек может иметь много файлов (одна и та же история для объекта Event). Один из способов добиться этого - поместить свойства навигации в класс File, указывая на классы Event и Person. Итак, ваша модель должна быть изменена следующим образом:
public class File {
public int Id { get; set; }
public string Path { get; set; }
public virtual ICollection<Event> Events { get; set; }
public virtual ICollection<Person> Persons { get; set; }
}
public class Event {
public int Id { get; set; }
public string EventName { get; set; }
public virtual ICollection<File> Files {get;set;}
}
public class Person {
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<File> Files { get; set; }
}
public class MyContext : DbContext {
public DbSet<Person> Persons { get; set; }
public DbSet<Event> Events { get; set; }
public DbSet<File> Files { get; set; }
}
В результате EF создаст таблицы ссылок (Events_Files и Files_Persons), чтобы сопоставить эти многие и многие ассоциации с базой данных.
Update:
При использовании POCOs с EF, если вы помечаете свои свойства навигации как виртуальные, вы будете участвовать в некоторых дополнительных EF-поддержке, таких как Lazy Loading and Relationship Fixup. Таким образом, в общем случае виртуальное ключевое слово в свойствах навигации считается хорошей практикой.