2016-03-22 13 views
0

Entity Frameworkとの多対多の関係を構築するときに少し問題があります。私はConnectionPointRoute経由でConnectionPointとRouteの間に多対多の関係を作りようとしています。しかし、DB更新(シードの実行)を実行すると、 "競合する変更が検出されました"というメッセージが表示されます。同じキーで複数のエンティティを挿入しようとすると発生する可能性があります。私はおそらく何かを見落としているだろうが、どんな助けもありがとう!あなたのConnectionPointRoute競合する変更が検出されました。多く追加の値を持つ多くの関係

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

を私はEFが自動インクリメントと複合キーをサポートして疑うことはこのように構成されるだろうしたがって、それらのエントリをそのままデータベースに送ります(両方ともキー列がdefault(int)= 0に設定されています)。このエラーが発生すると予想されます。鍵を設定して異なる値を修正するか、鍵を編集してこの問題を修正してください。 – DevilSuichiro

+0

申し訳ありませんが、私はあなたに従ったとは思わない、あなたは少し具体的なことができますか?前もって感謝します! –

+0

私はこの問題と同じ問題に遭遇していると思います:http://stackoverflow.com/questions/14751898/how-to-solve-combined-one-to-one-and-one-to-many-relationship-in -ef-5-code-first –

答えて

1

は、2つのリスト<>を持っています。 ConnectionPointConnectionPointRouteとの間に多対多があり、ConnectionPointRouteRoute(オプション#1)の間に多対多が必要ですか?

それともあなたがやろうとしている多対多のどこConnectionPointRouteConnectionPoint間とRouteある結合テーブル(2オプション#)?

私はあなたがオプション#2を望んでいると推測しています。

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

モデルビルダー::

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

および作成する: - デフォルトはDatabaseGeneratedOption.Noneだろう

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

あなたは私の一日を作ったばかりです!ありがとう! :D –

関連する問題