2016-03-22 5 views
0

Ich habe ein kleines Problem beim Aufbau meiner Viele-zu-Viele-Beziehung mit Entity Framework. Ich versuche, über die ConnectionPointRoute eine Viele-zu-Viele-Beziehung zwischen ConnectionPoint und Route herzustellen. Aber beim Ausführen der Datenbankaktualisierung (Ausführen des Seeds) erhalte ich die Meldung "Widersprüchliche Änderungen gefunden. Dies kann passieren, wenn versucht wird, mehrere Entitäten mit demselben Schlüssel einzufügen.". Ich werde wahrscheinlich nur etwas übersehen, aber jede Hilfe wird geschätzt!Widersprüchliche Änderungen erkannt. Viele zu viele Beziehung mit zusätzlichen Werten

public class ConnectionPoint 
{ 
    public int ConnectionPointId { get; set; } 
    public string ConnectionPointName { get; set; } 
    public virtual Location Location { get; set; } 
    public virtual ICollection<ConnectionPointRoute> ConnectionPointRoutes { get; set; } 
    public virtual ICollection<Connection> Connections { get; set; } 
} 

public class Route 
{ 
    public int RouteId { get; set; } 
    public string RouteName { get; set; } 
    public virtual ICollection<ConnectionPointRoute> ConnectionPointRoutes { get; set; } 
} 

public class ConnectionPointRoute 
{ 
    public int ConnectionPointId { get; set; } 
    public int RouteId { get; set; } 
    public int Position { get; set; } 
    public virtual ICollection<ConnectionPoint> ConnectionPoints { get; set; } 
    public virtual ICollection<Route> Routes { get; set; } 
} 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

     modelBuilder.Entity<ConnectionPointRoute>() 
      .HasKey(c => new { c.ConnectionPointId, c.RouteId }); 

     modelBuilder.Entity<ConnectionPoint>() 
      .HasMany(c => c.ConnectionPointRoutes) 
      .WithRequired() 
      .HasForeignKey(c => c.ConnectionPointId); 

     modelBuilder.Entity<Route>() 
      .HasMany(c => c.ConnectionPointRoutes) 
      .WithRequired() 
      .HasForeignKey(c => c.RouteId); 
    } 
     var ConnectionPointRoutes = new List<ConnectionPointRoute> 
     { 
      new ConnectionPointRoute { Routes = new List<Route>(), ConnectionPoints= new List<ConnectionPoint>(), Position = 1}, 
      new ConnectionPointRoute { Routes = new List<Route>(), ConnectionPoints= new List<ConnectionPoint>(), Position = 2}, 
      new ConnectionPointRoute { Routes = new List<Route>(), ConnectionPoints= new List<ConnectionPoint>(), Position = 2}, 
      new ConnectionPointRoute { Routes = new List<Route>(), ConnectionPoints= new List<ConnectionPoint>(), Position = 1} 
     }; 
     ConnectionPointRoutes.ForEach(r => context.ConnectionPointRoutes.AddOrUpdate(r)); 
     context.SaveChanges(); 
+0

Ich bezweifle EF unterstützt mit autoincrement zusammengesetzten Schlüssel - der Standard wäre DatabaseGeneratedOption.None , so dass diese Einträge unverändert an die Datenbank gesendet werden (alle mit beiden Schlüsselspalten sind auf Standard (int) = 0 gesetzt), und Sie würden erwarten, dass dieser Fehler auftritt. Legen Sie die Schlüssel fest, um bestimmte Werte zu korrigieren, oder bearbeiten Sie den Schlüssel, um dieses Problem zu beheben. – DevilSuichiro

+0

Entschuldigung, ich glaube nicht, dass ich dir folge, könntest du etwas genauer sein? Danke im Voraus! –

+0

Ich denke, Sie stoßen auf das gleiche Problem wie folgt: http://StackOverflow.com/Questions/14751898/How-to-solve-combined-one-to-one-and-one-to-many-relationship-in -ef-5-code-first –

Antwort

1

Ihre ConnectionPointRoute hat zwei Listen <>. Möchten Sie zwischen ConnectionPoint und ConnectionPointRoute und vielen anderen Geräten zwischen ConnectionPointRoute und Route (Option # 1) ein Many-to-Many?

Oder versuchen Sie eine many-to-many zwischen ConnectionPoint und Route wo ConnectionPointRoute ist die Join-Tabelle (Option # 2) zu tun?

Ich vermute, dass Sie Option # 2 wollten.

public class ConnectionPointRoute 
{ 
    public int ConnectionPointId { get; set; } 

    public int RouteId { get; set; } 

    public int Position { get; set; } 

    public virtual ConnectionPoint ConnectionPoint { get; set; } 

    public virtual Route Route { get; set; } 
} 

Model Builder:

modelBuilder.Entity<ConnectionPointRoute>() 
    .HasKey(c => new { c.ConnectionPointId, c.RouteId }); 

modelBuilder.Entity<ConnectionPoint>() 
    .HasMany(c => c.ConnectionPointRoutes) 
    .WithRequired(x => x.ConnectionPoint) 
    .HasForeignKey(c => c.ConnectionPointId); 

modelBuilder.Entity<Route>() 
    .HasMany(c => c.ConnectionPointRoutes) 
    .WithRequired(x => x.Route) 
    .HasForeignKey(c => c.RouteId); 

Und zu erstellen: Es würde so konfiguriert werden

new ConnectionPointRoute { Route = new Route(), ConnectionPoint= new ConnectionPoint(), Position = 1} 
+0

Sie haben gerade meinen Tag gemacht! Vielen Dank! : D –

Verwandte Themen