0

新しい 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;
                            }
                        }                            
                    }
                }
            }
        }
    
4

1 に答える 1

0

AddLink メソッドは期待どおりに機能していました。データの問題により、エラーが発生していました。

于 2012-06-26T20:09:19.387 に答える