Подтвердить что ты не робот

Как получить много ко многим ассоциациям в корневом коде Entity First

Я только начинаю работать с EF, и я смотрел несколько великолепных видеороликов. Я застрял со следующим.

У меня есть класс для коллекции файлов, я бы хотел, чтобы они были привязаны к событиям и/или людям.

public class file{
    public int id {get;set;}
    public string path {get;set;}
}

public event {
    public int id {get;set;}
    public string eventname {get;set}
    public virtual ICollection<file> files {get;set;}
    public event(){ files = new list<file>();}
}

public person {
    public int id {get;set;}
    public string name {get;set}
    public virtual ICollection<file> files {get;set;}
    public person(){ files = new list<file>();}
}

Теперь, когда я создаю базу данных, в моей таблице файлов есть идентификатор PersonID AND EventID.

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

4b9b3361

Ответ 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. Таким образом, в общем случае виртуальное ключевое слово в свойствах навигации считается хорошей практикой.