0

このlinqのトランザクションをSQLコードに追加する方法

MyDBDataContext DB = new MyDBDataContext();
            SurveyClient objMaster = new SurveyClient();
            objMaster.SurveyID = int.Parse(dtQuestions.Rows[0]["SurveyID"].ToString());
            MembershipUser myObject = Membership.GetUser();
            myObject.ProviderUserKey.ToString();
            objMaster.UserID = Guid.Parse(myObject.ProviderUserKey.ToString());  //Guid.Parse("993a109d-a0c7-4946-a8da-99fb594f3ce2");// current userID
            objMaster.SurveyDate = DateTime.Now;
            DB.SurveyClients.InsertOnSubmit(objMaster);
           // DB.SubmitChanges();

            foreach (DataRow dr in dtQuestions.Rows)
            {
                int currQueScore = GetAnswerScore(dr["AnswerType"].ToString().Trim(), dr["ClientAnswerValue"].ToString().Trim());
                dr["ClientAnswerScore"] = currQueScore;
                myScore += currQueScore;
                SurveyClientAnswer objDetail = new SurveyClientAnswer();
                objDetail.SurveyClientID = objMaster.SurveyClientID;
                objDetail.QuestionID = int.Parse(dr["QuestionID"].ToString());
                objDetail.Answer = dr["ClientAnswerValue"].ToString();
                objDetail.Score = int.Parse(dr["ClientAnswerScore"].ToString());
                DB.SurveyClientAnswers.InsertOnSubmit(objDetail);
               // DB.SubmitChanges();
            }
            objMaster.FinalScore = myScore;
            DB.SubmitChanges();

2つの DB.SubmitChanges() にコメントすると、エラーがスローされます

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_SurveyClientAnswers_SurveyClientAnswers". The conflict occurred in database "NEXLEV", table "dbo.SurveyClient", column 'SurveyClientID'.
The statement has been terminated.
4

2 に答える 2

1

あなたは正しい道を進んでいましたが、「データベース指向」を考えすぎていました。

実際、objMasterにはまだIDがないため、問題が発生しています。ただし、Linqでは、マスターIDを詳細に割り当てるのではなく、代わりにマスターを詳細エンティティクラスに割り当てる必要があります(またはその逆)。

Soheの問題はこの行です:

objDetail.SurveyClientID = objMaster.SurveyClientID; 

次のように変更する必要があります

objDetail.SurveyClient = objMaster; 

その場合、すべてが1つのSubmitChanges()で機能し、Linqがトランザクションを追加し、IDの設定を正しい方法で管理するのに十分スマートであるため、トランザクション管理は必要ありません。

[仮定:DBに外部キー制約が設定されている]

于 2012-05-30T16:25:08.397 に答える
0

objMaster.SurveyClientID はデータベースになく、SurveyClientAnwser に割り当てるときに ID がないため、割り当てていません。最初の (コメント付き) DB.SubmitChanges() は変更をデータベースに送信し、objMaster.SurveyClientID が割り当てられます (データベースで自動割り当て)。次に、objDetail.SurveyClientID = objMaster.SurveyClientID; 行は実際の ID を SurveyClientAnwser に割り当てます。

1 つのトランザクションを作成するには、トランザクション スコープを作成する必要があります。

  MyDBDataContext DB = new MyDBDataContext();
  using (TransactionScope ts = new TransactionScope())
  {
      SurveyClient objMaster = new SurveyClient();
      objMaster.SurveyID = int.Parse(dtQuestions.Rows[0]["SurveyID"].ToString());
      MembershipUser myObject = Membership.GetUser();
      myObject.ProviderUserKey.ToString();
      objMaster.UserID = Guid.Parse(myObject.ProviderUserKey.ToString());  //Guid.Parse("993a109d-a0c7-4946-a8da-99fb594f3ce2");// current userID                  
      objMaster.SurveyDate = DateTime.Now;                  DB.SurveyClients.InsertOnSubmit(objMaster);
      DB.SubmitChanges();
      foreach (DataRow dr in dtQuestions.Rows)                 
      {
            int currQueScore = GetAnswerScore(dr["AnswerType"].ToString().Trim(), dr["ClientAnswerValue"].ToString().Trim()); 
            dr["ClientAnswerScore"] = currQueScore;
            myScore += currQueScore;  
            SurveyClientAnswer objDetail = new SurveyClientAnswer();                      
            objDetail.SurveyClientID = objMaster.SurveyClientID;   
            objDetail.QuestionID = int.Parse(dr["QuestionID"].ToString()); 
            objDetail.Answer = dr["ClientAnswerValue"].ToString(); 
            objDetail.Score = int.Parse(dr["ClientAnswerScore"].ToString());       
            DB.SurveyClientAnswers.InsertOnSubmit(objDetail);
            // DB.SubmitChanges(); //no need for this one
      }
      objMaster.FinalScore = myScore;
      DB.SubmitChanges();      

      ts.Complete();
  }
于 2012-05-30T11:35:06.723 に答える