2016-11-11 3 views
0

私は、すべてのエンティティが自分の参照を持つ別のエンティティへの参照を持つ空港エンティティを持っています。EntityState.Modifiedを使用してEF 6 DbContexの更新に失敗しました

空港を更新しようとしているときには、私はいくつかの例外を持っている.. HERESに私はこれに持ってまで、私はすでに、最も簡単な更新を試してみた

var airport = context.Airports 
    .Where(a => a.AirportID == airportToUpdate.AirportID).FirstOrDefault(); 

var ai = AirportConverter.ToModel(airportToUpdate); 
ai.AirportID = airport.AirportID; 
airport.IsOpenForFlights = ai.IsOpenForFlights; 

airport.EmergencyLandings = new List<Scenario>(); 
foreach (var emergency in ai.EmergencyLandings) 
{ 
    var sce = context.Scenarios 
     .Include(s => s.Mission).Include(s => s.Planes) 
     .Where(s => s.ScenarioID == emergency.ScenarioID).First(); 
    airport.EmergencyLandings.Add(sce); 
    context.Entry(sce).State = EntityState.Modified; 
} 

airport.ExistingFilghtNumbers = new List<string>(); 
foreach (var flight in ai.ExistingFilghtNumbers) 
{ 
    airport.ExistingFilghtNumbers.Add(flight); 
    context.Entry(flight).State = EntityState.Modified; 
} 

var parkingLot = ai.ParkingLots.First(); 
var pLot = context.ParkingLots 
    .Include(p => p.AtAirport) 
    .Include(p => p.ParkingStations.Select(pa => pa.PlaneParking)) 
    .Where(p => p.ParkingLotID == parkingLot.ParkingLotID).First(); 
airport.ParkingLots = new List<ParkingLot>(); 
airport.ParkingLots.Add(pLot); 
context.Entry(pLot).State = EntityState.Modified; 

airport.Queues = new List<PlanesQueue>(); 
foreach (var queue in ai.Queues) 
{ 
    qu = context.PlanesQueues 
     .Include(p => p.Planes.Select(pl => pl.AtQueue)) 
     .Where(q => q.QueueNumber == queue.QueueNumber).First(); 
    qu.Planes = queue.Planes; 
    airport.Queues.Add(qu); 
    context.Entry(qu).State = EntityState.Modified; 
} 

airport.Routes = new List<Route>(); 
foreach (var route in ai.Routes) 
{ 
    var ro = context.Routes 
     .Include(r => r.PlaneOnRoute) 
     .Where(r => r.RouteID == route.RouteID).First(); 
    airport.Routes.Add(route); 
    context.Entry(route).State = EntityState.Modified; 
} 

//var entry = context.Entry(airport); 
//entry.State = System.Data.Entity.EntityState.Modified; 
context.SaveChanges(); 

空港に更新しようとしたコードコード は、エンティティを最初に削除してからもう一度追加し、空港自体を更新する前にすべてのエンティティを更新しようとしました。型「FlightsControl.Dal.Entities.Route」が複数のエンティティが同じ主キー値を持っているので、

保存または受諾の変更などの

、それはまだ動作しません、多くの例外に失敗しました。明示的に設定された主キー値が一意であることを確認します。データベース生成の主キーがデータベースとEntity Frameworkモデルで正しく構成されていることを確認します。 Entity Designerをデータベースファースト/モデルファースト構成に使用します。それは私がちょうどそれを追加し、これを更新しないようにしようとしている、同じ主キーを持っています。..

を当然のコードファースト構成

のための「HasDatabaseGeneratedOption」流暢なAPIや 『DatabaseGeneratedAttribute』を使用しますこれは、空港のエンティティ

public virtual int AirportID { get; set; } 
public ICollection<PlanesQueue> Queues { get; set; } 
public ICollection<ParkingLot> ParkingLots { get; set; } 
public ICollection<Route> Routes { get; set; } 
public virtual ICollection<string> ExistingFilghtNumbers { get; set; } 
public virtual bool IsOpenForFlights { get; set; } 
public ICollection<Scenario> EmergencyLandings { get; set; } 

空港コンフィグ

です
+0

まあ、Routeの特定のケースでは、あなたは 'var ro = context.Routes.Include(r => r.PlaneOnRoute).Ahereの変数にそれを問い合わせて返します.Where(r => r.RouteID = = route.RouteID).First(); 'であり、' context.Entry(Route).State = EntityState.Modified;のモデルで変更されたものを追加してフラグを立てるために別のエンティティを使用しています。 –

答えて

0

Routeのコンテキストを照会していますが、リストに追加しているものと変更したもののフラグは、ループでフェッチされた1つのエンティティです。
他のすべての場合と同様に、他のルートの代わりにクエリしたルートを使用してみてください。同様に:

airport.Routes = new List<Route>(); 
foreach (var route in ai.Routes) 
{ 
    var ro = context.Routes 
     .Include(r => r.PlaneOnRoute) 
     .First(r => r.RouteID == route.RouteID); 
    airport.Routes.Add(ro); 
    context.Entry(ro).State = EntityState.Modified; 
} 

そして、ほんの少しのノート:私は私のコードサンプルで行ったようにあなたは、簡潔にするためcontext.Routes.Include(r => r.PlaneOnRoute).First(r => r.RouteID == route.RouteID);を書くことができようにLINQのFirstメソッドは、パラメータとして述語を受け入れるバージョンがあります。

+0

まだ、それは私に同じ例外をスローします、それは私が 'ai.Routes'の'ルート 'を望んでいることですそれは最新のので空港にadedされるでしょう –

+0

どのDBを使用していますか?私は後でそれを再現しようとすることができます。 –

+0

それを作った..私は 'route'を更新しようとしているのではなく、' ro' –

関連する問題