2017-05-13 2 views
1

Ich erstelle gerade meine erste "komplexe" Anwendung mit Entity Framework, und ich stoße auf mein erstes Problem.Mehrere Eins-zu-Viele in einer einzigen Entität

Ich habe zwei Entitäten: Users und Events kann eine definierte User entweder eine Event organisieren oder einen Teilnehmer in einem Event sein. Ich möchte die Beziehung zwischen diesen Entitäten so implementieren, dass ich für einen definierten Benutzer entweder alle von ihm organisierten Events abrufen oder alle von ihm abonnierten Events abrufen kann.

Event.cs

public virtual User Organizer { get; set; } 
public List<User> Participants { get; set; } 

User.cs

public virtual ICollection<Event> EventsOrganized { get; set; } 
public virtual ICollection<Event> EventsSubscribedFor { get; set; } 

Wie kann ich angeben, dass die EventsOrganized auf die Organizer Eigenschaft beziehen sollten, und die EventsSubscribedFor auf die Participants Eigenschaft beziehen sollte?

+1

Fluent API oder 'InverseProperty' Attribut –

+0

@IvanStoev Sie wissen nicht, wie ich mit meiner Suche nicht feststellen, dass, danke! Sie können es als Antwort veröffentlichen, wenn Sie möchten. – Sakuto

+0

Mach dir keine Sorgen, Kumpel, es passiert. Da ich sicher bin, dass es ein Betrogener ist, überlasse ich es als Kommentar. Froh, dass es geholfen hat, Prost. –

Antwort

1

Ich gehe davon aus, Sie können Sie Fluent API.

In Ihrer DbContext Klasse erstellen oder zu Ihrer OnModelCreating Überschreibung hinzufügen

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>() 
      .HasMany(s => s.EventsOrganized) 
      .WithRequired(c => c.Organizer) 
      .WillCascadeOnDelete(false); 

     modelBuilder.Entity<User>() 
      .HasMany(s => s.EventsSubscribedFor) 
      .WithMany(c => c.Participants)     
      .Map(cs => 
      { 
       cs.MapLeftKey("UserId"); 
       cs.MapRightKey("EventId"); 
      }); 

     base.OnModelCreating(modelBuilder); 
    } 

Was los ist, ist ich die DbContext sage, dass der Benutzer Entity viele EventOrganized mit einem erforderlichen Organizer hat, und dann die DbContext sagen zu nicht kaskadieren löscht. Dann erzähle ich dem DbContext, dass die User Entity viele Events SubscribedFor viele Teilnehmer hat. Dann mappe ich die linken und rechten Tasten. Dadurch wird eine Tabelle mit dem Namen "UserEvents" erstellt, die Sie mit cs.ToTable ("NameOfTable") als etwas anderes bezeichnen können.

Auch als Referenz EntityframeworkTutorials hat mir geholfen, über die Fluent API zu lernen, und das sind die Einheiten, die ich getestet habe.

public class User 
{ 
    public User() 
    { 
     EventsOrganized = new HashSet<Event>(); 
     EventsSubscribedFor = new HashSet<Event>(); 
    } 

    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Event> EventsOrganized { get; set; } 
    public virtual ICollection<Event> EventsSubscribedFor { get; set; } 
} 

public class Event 
{ 
    public Event() 
    { 
     Participants = new HashSet<User>(); 
    } 

    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public int OrganizerId { get; set; } 
    public virtual User Organizer { get; set; } 
    public ICollection<User> Participants { get; set; } 
} 
Verwandte Themen