27 votes

Comment avoir d'abord l'association plusieurs à plusieurs dans Entity Framework Code

Je viens de commencer avec EF et j'ai regardé de superbes vidéos de tutoriel. Je suis coincé avec ce qui suit.

J'ai une classe pour une collection de fichiers, je voudrais qu'ils soient liés à des événements et / ou des personnes

 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>();}
}
 

Maintenant, lorsque je génère la base de données, ma table de fichiers a un PersonID AND EventID.

Je veux pouvoir permettre aux utilisateurs de joindre des fichiers à des personnes et / ou à des événements.

J'espère que cela a du sens.

31voto

Morteza Manavi Points 20486

Ce que vous obtenez est le comportement par défaut de l'EF Code d'Abord en termes d'une cartographie de 1 à Plusieurs association de la base de données. Par exemple, vous avez un ICollection<File> sur la classe Personne, comme un résultat, EF créer un FK sur la table de Fichiers (PersonId) et de l'associer à l'Id de PK sur la table de Personnes.

Maintenant, je suppose que vous avez une beaucoup beaucoup de relation entre le Fichier et la Personne, de sorte que chaque fichier peut s'appliquer à de nombreuses Personnes et chaque Personne peut avoir beaucoup de fichiers (même histoire pour objet d'Événement ainsi). Une façon d'y parvenir est de mettre les propriétés de navigation sur le Fichier de classe, pointant à l'Événement et classes de la Personne. Donc, votre modèle doit être changé à cela:

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; }
}

En conséquence, EF lien créer des tables (Events_Files et Files_Persons) à la carte de ces nombreuses de nombreuses associations à la base de données.

Mise à jour:
Lors de l'utilisation de POCOs avec EF, si vous marquez votre navigation propriétés virtuel , vous opterez-à-uns des EF prend en charge comme le Chargement Paresseux et Relation de Correction. Donc, en général, ont un mot clé virtual dans les propriétés de navigation considéré comme une bonne pratique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X