このコードは、データベースファーストのEntityFrameworkレイヤーを使用する.Net4.5を対象としたWindowsサービスにあります。
var existingState = DataProcessor.GetProcessState(workerId);
existingState.ProcessStatusTypeId = (int)status;
existingState.PercentProgress = percentProgress;
existingState.ProgressLog = log;
DataProcessor.UpdateProcessState(existingState);
そして、同じソリューションのデータ処理クラスのこのコード:
public ProcessState GetProcessState(int id)
{
using (var context = new TaskManagerEntities())
{
var processes = (from p in context.ProcessStates.Include("ProcessType").Include("ProcessStatusType")
where p.IsActive && p.ProcessStateId == id
select p);
return processes.FirstOrDefault();
}
}
public ProcessState UpdateProcessState(ProcessState processState)
{
using (var context = new TaskManagerEntities())
{
context.ProcessStates.Add(processState);
context.Entry(processState).State = System.Data.EntityState.Modified;
context.SaveChanges();
}
return processState;
}
ProcessStateは、他の2つのクラス、ProcessStatusTypeとProcessTypeの親です。そのコードをWindowsサービスで実行すると、レコードが取得され、エンティティが更新されて保存されます。上記のコードではProcessTypeの子が使用されていないという事実にもかかわらず、ProcessStateエンティティの保存が実行されると、EFはProcessTypeテーブルに挿入を実行し、そのテーブルに新しいレコードを作成します。次に、ProcessStatusエンティティのFKを変更して、新しい子を指すようにし、データベースに保存します。
これは、本質的に同一のFK親子関係で設定されたProcessStatusTypeテーブルでは行われません。
これで、不要な同一のProcessTypeエントリでいっぱいのデータベースができましたが、なぜこれが発生しているのかわかりません。これが私の最初のEFプロジェクトであるため、私には見えない明らかな間違いを犯しているような気がします。呼び出しの合間にコンテキストを期限切れにすることを許可しているが、同じエンティティを維持しているという問題はありますか?