子エンティティ(セグメント)のコレクションを持つ親エンティティ(治療)があります。私は治療を受け取り、それが新規か既存かを判断し、それをobjectContextに追加するか、それが新規か既存かに基づいてオブジェクトコンテキストに追加するsaveメソッドを持っています。EF "Save"メソッドで問題が発生しました。子エンティティのコレクションが変更されました
メインエンティティ内の子と同じことを行います。子エンティティのコレクションを反復処理し、必要に応じて追加または更新します。
私がやりたいことは、欠落している子オブジェクトを削除することです。問題は、親オブジェクトを更新してオブジェクトコンテキストにアタッチすると、親オブジェクトにDBからの子オブジェクトのコレクションがあることです。私が最初に渡したコレクションではありません。したがって、3つのセグメントを持つ治療法がある場合、コレクションから1つのセグメントを削除してから、治療法を保存メソッドに渡します。治療オブジェクトがobjectcontextにそれのセグメント数が2から3に変更されました。
私は間違っていますか?
public bool Save(Treatment myTreatment, modelEntities myObjectContext)
{
bool result = false;
if (myObjectContext != null)
{
if (myTreatment.Treatment_ID == 0)
{
myObjectContext.Treatments.AddObject(myTreatment);
}
else
{
if (myTreatment.EntityState == System.Data.EntityState.Detached)
{
myObjectContext.Treatments.Attach(myTreatment);
}
myObjectContext.ObjectStateManager.ChangeObjectState(myTreatment, System.Data.EntityState.Modified);
myObjectContext.Treatments.ApplyCurrentValues(myTreatment);
}
foreach (Segment mySegment in myTreatment.Segments)
{
if (mySegment.SegmentID == 0)
{
myObjectContext.ObjectStateManager.ChangeObjectState(mySegment, System.Data.EntityState.Added);
myObjectContext.Segments.AddObject(mySegment);
}
else
{
if (mySegment.EntityState == System.Data.EntityState.Detached)
{
myObjectContext.Segments.Attach(mySegment);
}
myObjectContext.ObjectStateManager.ChangeObjectState(mySegment, System.Data.EntityState.Modified);
myObjectContext.Segments.ApplyCurrentValues(mySegment);
}
}
}
result = (myObjectContext.SaveChanges(SaveOptions.None) != 0);
return result;
}
* EDIT *下記のフィードバックの一部に基づいて* ** 、私が編集した "保存" 方法:ここで
は私の保存方法のコードです。新しいメソッドの実装は以下のとおりです。ただし、myTreatments.Segmentsコレクションから削除されたセグメントは削除されません。public bool Save(Treatment myTreatment, tamcEntities myObjectContext)
{
bool result = false;
if (myObjectContext != null)
{
if (myTreatment.Treatment_ID == 0)
{
myObjectContext.Treatments.AddObject(myTreatment);
}
else
{
if (myTreatment.EntityState == System.Data.EntityState.Detached)
{
myObjectContext.Treatments.Attach(myTreatment);
}
myObjectContext.ObjectStateManager.ChangeObjectState(myTreatment, System.Data.EntityState.Modified);
}
foreach (Segment mySegment in myTreatment.Segments)
{
if (mySegment.SegmentID == 0)
{
myObjectContext.ObjectStateManager.ChangeObjectState(mySegment, System.Data.EntityState.Added);
}
else
{
myObjectContext.ObjectStateManager.ChangeObjectState(mySegment, System.Data.EntityState.Modified);
}
}
}
result = (myObjectContext.SaveChanges(SaveOptions.None) != 0);
return result;
}
FINAL EDIT 私は最終的にそれが動作するようになってきました。ここでは、正常に動作している更新されたSaveメソッドを示します。私はセグメントの初期リストをローカル変数に保存してから、それをDBにアタッチされた後にmyTreatments.Segmentsリストと比較し、削除されるセグメントのリストを決定し、そのリストを反復してマッチングを削除しなければならなかった新しく添付されたmyTreatment.Segmentsリストのセグメント。また、以下のいくつかのレスポンダからのアドバイスごとにobjectcontextの受け渡しを削除しました。
public bool Save(Treatment myTreatment)
{
bool result = false;
List<Segment> myTreatmentSegments = myTreatment.Segments.ToList<Segment>();
using (tamcEntities myObjectContext = new tamcEntities())
{
if (myTreatment.Treatment_ID == 0)
{
myObjectContext.Treatments.AddObject(myTreatment);
}
else
{
if (myTreatment.EntityState == System.Data.EntityState.Detached)
{
myObjectContext.Treatments.Attach(myTreatment);
}
myObjectContext.ObjectStateManager.ChangeObjectState(myTreatment, System.Data.EntityState.Modified);
}
// Iterate over all the segments in myTreatment.Segments and update their EntityState to force
// them to update in the DB.
foreach (Segment mySegment in myTreatment.Segments)
{
if (mySegment.SegmentID == 0)
{
myObjectContext.ObjectStateManager.ChangeObjectState(mySegment, System.Data.EntityState.Added);
}
else
{
myObjectContext.ObjectStateManager.ChangeObjectState(mySegment, System.Data.EntityState.Modified);
}
}
// Create list of "Deleted" segments
List<Segment> myDeletedSegments = new List<Segment>();
foreach (Segment mySegment in myTreatment.Segments)
{
if (!myTreatmentSegments.Contains(mySegment))
{
myDeletedSegments.Add(mySegment);
}
}
// Iterate over list of "Deleted" segments and delete the matching segment from myTreatment.Segments
foreach (Segment mySegment in myDeletedSegments)
{
myObjectContext.ObjectStateManager.ChangeObjectState(mySegment, System.Data.EntityState.Deleted);
}
result = (myObjectContext.SaveChanges(SaveOptions.None) != 0);
}
return result;
}
オリジナルの投稿を変更して、あなたのコメントと@Shirazのコメントを考慮して、新しい「保存」方法を表示しました。しかし、私はまだセグメントの1つを削除できません。問題は、治療が最初にメソッドに入るときに、2つのセグメントを含み、それが接続されると、3つのセグメント(2つが渡されただけでなく、3番目のセグメントがDBから "失われた/削除された ")。だからそれは最終的に "SaveChanges()"を呼び出すとき、それはそのコレクションの3つすべてを持っていて、もともと含まれていなかったものを削除しません。 –
最新の編集をご覧ください。 –