2016-07-05 5 views
1

Ich habe einige EF-Code-First-Tabellen (eine, wenn sie ApplicationUser ist), und ich versuche, eine Migration zu erstellen, um eine Viele-zu-Viele-Beziehung hinzuzufügen.Warum generiert EF Migrations nicht die richtige Viele-zu-Viele-Beziehung?

public class ApplicationUser : IdentityUser 
{ 
    // many properties, not relevant here 

    // NEW RELATIONSHIP 
    public virtual ICollection<Trip> Trips { get; set; } = new HashSet<Trip>(); 
} 

public class Trip 
{ 
    // again, many properties 

    public string ClientId { get; set; } 

    [ForeignKey(nameof(ClientId))] 
    public virtual ApplicationUser Client { get; set; } 

    public string PartnerId { get; set; } 

    [ForeignKey(nameof(PartnerId))] 
    public virtual ApplicationUser Partner { get; set; } 

    // NEW RELATIONSHIP 
    public virtual ICollection<ApplicationUser> OtherUsers { get; set; } = new HashSet<ApplicationUser>(); 

} 

Hinweis gibt es bereits eine Beziehung statt (Trip hat zwei Fremdschlüssel in Richtung ApplicationUser, aber ich bin das Hinzufügen eines neuen

Wenn ich Add-Migration Trips in der Konsole ausgeführt werden, dies erzeugt wird.

public partial class Trips : DbMigration 
{ 
    public override void Up() 
    { 
     AddColumn("dbo.AspNetUsers", "Trip_TripId", c => c.Int()); 
     AddColumn("dbo.Trips", "ApplicationUser_Id", c => c.String(maxLength: 128)); 
     CreateIndex("dbo.AspNetUsers", "Trip_TripId"); 
     CreateIndex("dbo.Trips", "ApplicationUser_Id"); 
     AddForeignKey("dbo.AspNetUsers", "Trip_TripId", "dbo.Trips", "TripId"); 
     AddForeignKey("dbo.Trips", "ApplicationUser_Id", "dbo.AspNetUsers", "Id"); 
    } 

    public override void Down() 
    { 
     DropForeignKey("dbo.Trips", "ApplicationUser_Id", "dbo.AspNetUsers"); 
     DropForeignKey("dbo.AspNetUsers", "Trip_TripId", "dbo.Trips"); 
     DropIndex("dbo.Trips", new[] { "ApplicationUser_Id" }); 
     DropIndex("dbo.AspNetUsers", new[] { "Trip_TripId" }); 
     DropColumn("dbo.Trips", "ApplicationUser_Id"); 
     DropColumn("dbo.AspNetUsers", "Trip_TripId"); 
    } 
} 

Warum ist es zwei eins-zu-viele-Beziehungen statt einer many-to-many zu schaffen? ich war eine dritte Tabelle erzeugt werden erwartet.

Ich habe das vorher ohne Probleme gemacht, aber ich weiß nicht, ob die Tatsache, dass ich bereits Fremdschlüssel habe, die Generation stört.

Ich habe gesehen, another answer, dass dies mit der Fluent-API löst, aber ich brauchte nie zuvor zu verwenden. Ist es wirklich die einzige Möglichkeit, es zu lösen? Was mache ich falsch?

Antwort

1

Ich glaube, Sie brauchen eine InverseProperty auf einer der neuen Sammlungen. Versuchen Sie, Ihre Trip Klasse ändern, wie

folgt
// NEW RELATIONSHIP 
[InverseProperty("Trips")] 
public virtual ICollection<ApplicationUser> OtherUsers { get; set; } = new HashSet<ApplicationUser>(); 

, dass sie die Beziehung erzählt, ist zwischen der OtherUsers Sammlung und der Trips Eigentum/Sammlung.

Weitere Informationen unter Using both many-to-many and one-to-many to same entity

Update: Ich stelle fest, die Kommentare auf der anderen Frage nicht eindeutig sind, ob es funktioniert. Ich habe es nicht persönlich mit vielen-zu-viele Beziehungen versucht, aber dies funktioniert für Situationen wie Entity Framework, code-first: combining master-detail with zero-to-one relationship

Ich bin interessiert zu hören, ob es in Ihrem Fall funktioniert.

+0

Danke! Das hat wirklich für mich funktioniert. –

+0

Ich bin immer noch neugierig, warum es es nicht automatisch erkennt, obwohl. –

+0

Da es außerhalb der Konventionen liegt, erwarte ich, dass sie nicht raten wollen. Die Dinge könnten durch mehrere Beziehungen zwischen den Klassen verwirrt werden. Froh, dass es funktioniert hat! – Tone