新しい InputOutputMap に関連する新しい ParameterPart エンティティがあります。InputOutputMap には、データベースから取得したいくつかの InputStates があり、InputOutputMap に関連付ける必要があります。MVC および WCF データ サービスを使用して、このチェーンをデータベースに保存するにはどうすればよいですか? 次のコードを使用しています (ajax 呼び出しを介して呼び出され、コンテキストはコンストラクターの最初の呼び出しでのみ設定されます) が、いくつかの問題が発生しています。
- AddLink を使用すると (以下に示すように)、最初に試したときにデータを追加できます (関連付ける必要がある入力状態の数に関係なく)。ただし、(ajax を介して) メソッドが再度呼び出された場合、入力状態を 1 つ指定している場合にのみデータを追加できます。複数の入力状態がある場合、コンテキストは既に関係を追跡しています。メソッドが ajax 呼び出しを使用して呼び出されていることに注意してください。
- SetLink、AddRelatedObject、および attach を使用してみましたが、上記のシナリオで毎回エラーが発生します。場合によっては、コンテキストがエンティティまたは関係を既に追跡しているというエラーが発生することがあります。また、コンテキストがエンティティを追跡していない場合もあります。
コンストラクターではなくメソッドでコンテキストを設定しても、何のメリットもありませんでした。
if (vm != null) { ParameterPart parameterPart = null; // Create a new parameter if (vm.PartNumberId == 0) { // Create an instance of ParameterPart parameterPart = new ParameterPart() { Description = vm.ParameterDescription }; // Save the ParameterPart into the database try { ctx.AddToParameterParts(parameterPart); ctx.SaveChanges(); } catch (System.Exception ex) { throw; } } else { // Fetch the existing parameter parameterPart = new ParameterPart(); parameterPart = (from pp in ctx.ParameterParts where pp.PartNumberId == vm.PartNumberId select pp).Single(); // Update the ParameterPart from the vm parameterPart.Description = vm.ParameterDescription; } if (parameterPart != null) { if (vm.StateValues.Count > 0) { InputOutputMap inputOutputMap = new InputOutputMap(); inputOutputMap.PartNumberId = parameterPart.PartNumberId; ctx.AddToInputOutputMaps(inputOutputMap); // Prepare a new InputOutputMap foreach (var state in vm.StateValues) { if (state.InputStateId != 0) { // Fetch the inputstate var inputState = (from i in ctx.InputStates where i.InputStateId == state.InputStateId select i).Single(); try { ctx.AddLink(inputOutputMap, "InputStates", inputState); ctx.SaveChanges(); } catch (System.Exception ex) { throw; } } } } } }