2015-08-11 20 views
8

Ich habe ein sehr einfaches Modell:EF 7 Beta 6: Entities mit einer zu vielen Beziehungen in EF 7

class Bag 
{ 
    public int Id { get; set; } 
    public ICollection<RandomThing> RandomThings { get; set; } 
} 

class RandomThing 
{ 
    public int Id { get; set; } 
    public String Description{ get; set; } 
} 

OnModelCreating My Kontext (in EF 6) ist so etwas wie:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Entity<Bag>() 
     .ToTable("Bag") 
     .HasMany(x => x.RandomThings).WithRequired(x => x.Bag).WillCascadeOnDelete(); 

    modelBuilder.Entity<RandomThing>().ToTable("RandomThing"); 
} 

Soweit ich sagen kann, gibt es keine gleichwertige Möglichkeit, dies zu tun. Ich weiß das cascade deletes are not supported. Wie auch immer, ich frage mich, was ist der beste Weg, um die eine zu vielen Beziehungen zu modellieren, wie in meinem Codebeispiel definiert? Es scheint, als ob all das Zeug verschwunden ist (oder noch zu implementieren ist).

Ich habe ein Beispiel() einer DbContext genau wie ich will gesehen, aber es ist eigentlich falsch und funktioniert nicht. Wenn ich versuche, den Quellcode zu entfernen, meine Umgebung einzurichten und eine Blog-Entität mit Posts zu speichern, werden diese Posts nicht so gespeichert, wie man es sich vorstellt.

Gibt es Workarounds dafür?

Antwort

3

Aktualisieren: Diese Antwort wurde für EF7 beta7 geschrieben. APIs haben sich seitdem geändert. Aktuelle Informationen zur Verwendung von EF Core finden Sie unter http://docs.efproject.net/en/latest/modeling/relationships.html.

Original-Antwort

In EF 7 können Sie ein zu viele Beziehungen in der OnModelCreating Methode konfigurieren. Fügen Sie dazu eine Eigenschaft zu RandomThing hinzu, um den Forign-Schlüssel und eine CLR-Referenz zu dem übergeordneten Typ darzustellen.

class Bag 
{ 
    public int Id { get; set; } 
    public ICollection<RandomThing> RandomThings { get; set; } 
} 

class RandomThing 
{ 
    public int Id { get; set; } 
    public String Description{ get; set; } 

    public Bag Bag { get; set; } 
    public int BagId { get; set; } 
} 

In Ihrem Kontext, konfigurieren Sie die Beziehung mit dem folgenden Aufbau:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<RandomThing>() 
     .Reference(e => e.Bag) 
     .InverseCollection(p => p.RandomThings) 
     .ForeignKey(e => e.BagId); 
} 

Exkurs: Wenn EF 7 plans to add support dies für die Konfiguration über stattdessen Attribute.

+0

wenn ich einen context.Add (bag) mache, gefolgt von einem context.Save(), nur die Bag-Entität wird gespeichert (nur die Id) die RandomThings-Sammlung wird nicht entsprechend gespeichert. – Lutando

+0

In EF 7 müssen Sie jetzt .Add() aufrufen, um auch RandomThings zu erreichen, aber dies wird sich wahrscheinlich in kommenden Betas ändern (willkommen zur Freude der Vorabversion). – natemcmaster

+0

Vielen Dank. Ich habe das schon gemacht, ich habe mich nur gefragt, ob es einen umfassenderen Weg gibt, es bisher zu tun. – Lutando

0

obwohl ich nicht EF7 überhaupt benutzt haben, in EF6 würde ich Ihre Modelle machen aussehen:

class Bag 
{ 
    public int Id { get; set; } 
    public virtual ICollection<RandomThing> RandomThings { get; set; } 
} 

class RandomThing 
{ 
    public int Id { get; set; } 
    public String Description{ get; set; } 

    public int BagId {get; set;} 
    [ForeignKey("BagId")] 
    Public Bag Bag {get; set;} 
} 

auf diese Weise die Beziehung Pflege mit Daten Anmerkungen genommen wird und Sie nicht brauchen die model builder für diese spezifische Aufgabe

+0

Ja, das funktioniert noch nicht in EF7 aber Unterstützung wird kommen. – Lutando