2013-07-31 53 views
0

更新:實體框架的CheckBoxList數據庫插入

我使用一個DetailsView插入控件,我想從一個CheckBoxList的一個複選框在數據庫中創建一個新的行。我得到了 「INSERT語句衝突與外鍵約束」

這裏是我的CS:

protected void AddPrincipleStaffDetailsView_ItemInserting(object sender, DetailsViewInsertEventArgs e) 
    { 
     CheckBoxList PrincipleStaffTitle = (CheckBoxList)FindControl("PrincipleStaffTitle"); 

     if (PrincipleStaffTitle != null) 
     { 
      foreach (ListItem item in PrincipleStaffTitle.Items) 
      { 
       if (item.Selected) 
       { 

        string stringSession = Session["ProductionID"].ToString(); 
        int intProductionID = Int32.Parse(stringSession); 

        var ID = item.Value; 



        using (var context = new FactoryTheaterModelFirstContainer()) 
        { 
         PrincipleStaff principlestaff = new PrincipleStaff(); 

         principlestaff.PrincipleStaffTitle = ID; 
         principlestaff.Production_proProductionID = intProductionID; 

         context.PrincipleStaffs.Add(principlestaff); 
         context.SaveChanges(); 
        } 

       } 
      } 
     } 

這裏是ASPX:

<asp:EntityDataSource ID="PrincipleStaffSource" runat="server" ConnectionString="name=FactoryTheaterModelFirstContainer" DefaultContainerName="FactoryTheaterModelFirstContainer" EnableFlattening="False" EntitySetName="PrincipleStaffs" EntityTypeFilter="PrincipleStaff" EnableInsert="True"></asp:EntityDataSource> 
<asp:DetailsView ID="AddPrincipleStaffDetailsView" runat="server" AutoGenerateRows="False" DataKeyNames="PrincipleStaffID" DataSourceID="PrincipleStaffSource" Height="50px" Width="730px" DefaultMode="Insert" OnItemInserting="AddPrincipleStaffDetailsView_ItemInserting" OnItemInserted="AddPrincipleStaffDetailsView_ItemInserted"> 
    <Fields> 
     <asp:TemplateField HeaderText="Add Principle Staff Role:" SortExpression="PrincipleStaffTitle"> 
      <InsertItemTemplate> 
       <asp:CheckBoxList ID="PrincipleStaffTitle" runat="server" SelectedValue='<%# Bind("PrincipleStaffTitle") %>'> 
        <asp:ListItem Value="Director">Director(s)</asp:ListItem> 
        <asp:ListItem Value="Assistant Director">Assistant Director(s)</asp:ListItem> 
        <asp:ListItem Value="Written By">Written By(s)</asp:ListItem> 
        <asp:ListItem Value="Executive Producer">Executive Producer(s)</asp:ListItem> 
        <asp:ListItem Value="Producer">Producer(s)</asp:ListItem> 
        <asp:ListItem Value="Techincal Director">Technical Director(s)</asp:ListItem> 
       </asp:CheckBoxList> 
      </InsertItemTemplate> 
      <ItemTemplate> 
       <asp:Label ID="Label1" runat="server" Text='<%# Bind("PrincipleStaffTitle") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:CommandField ShowInsertButton="True" /> 
    </Fields> 
</asp:DetailsView> 

的Production.proProductionID是外鍵,我試圖進入PrincipleStaff Production_proProductionid列。我似乎無法創建FK關係。

感謝您提供任何幫助!

+0

爲什麼在這裏使用tow dbContext實例?你能爲你的兩個相關實體發佈代碼嗎? –

+0

謝謝Jayantha。我已經更新了代碼以僅使用1個數據庫實例。當我發佈代碼時,這是我最後的努力,但我認爲這更接近它應該看起來的樣子。我想知道如果我在這裏遇到父母/孩子關係的問題。 – chuckles

+0

有可能。你可以發佈你的兩個相關實體嗎? –

回答

0

下面的代碼有效。我已經移動了我的context.savechanges();在循環之外。我的問題發生在我的ItemInserted命令上。

protected void AddPrincipleStaffDetailsView_ItemInserting(object sender, DetailsViewInsertEventArgs e) 
    { 
     CheckBoxList PrincipleStaffCheckBox = (CheckBoxList)AddPrincipleStaffDetailsView.FindControl("PrincipleStaffTitleCheckBoxList"); 

     if (PrincipleStaffCheckBox.Items.Count > 0) 
     { 
      foreach (ListItem item in PrincipleStaffCheckBox.Items) 
      { 
       if (item.Selected) 
       { 

        string stringSession = Session["ProductionID"].ToString(); 
        int intProductionID = 0; 
        intProductionID = Int32.Parse(stringSession); 
        var principlestafftitle = item.Value; 

         try 
         { 
          using (var context = new FactoryTheaterModelFirstContainer()) 
          { 

           Production proid = context.Productions.Single(i => i.proProductionID == intProductionID); 
           PrincipleStaff principlestaff = new PrincipleStaff() 
           { 
            PrincipleStaffTitle = principlestafftitle, 
            Production_proProductionID = intProductionID 
           }; 

           proid.PrincipleStaffs.Add(principlestaff); 
           context.SaveChanges(); 
          } 
         } 
         catch (Exception f) 
         { 
          Console.WriteLine(f); // or log to file, etc. 
          throw; // re-throw the exception if you want it to continue up the stack 
         } 
       } 
      } 
     } 
    }