Asp.net 仅当n层web应用程序的属性当前值为null时,才能设置EntityKey属性

Asp.net 仅当n层web应用程序的属性当前值为null时,才能设置EntityKey属性,asp.net,entity-framework,Asp.net,Entity Framework,我正在使用带有ObjectDataSource的实体框架的n层web应用程序。 在我的web应用程序中,存在具有多对一或零关系的投诉和工作订单实体 添加工单后,用户可以选择该工单的投诉对象。这就是我试图做的 <asp:DetailsView ID="DVComplain" runat="server" DefaultMode="Insert" AutoGenerateInsertButton="True" AutoGenerateRows="False"

我正在使用带有ObjectDataSource的实体框架的n层web应用程序。 在我的web应用程序中,存在具有多对一或零关系的投诉和工作订单实体

添加工单后,用户可以选择该工单的投诉对象。这就是我试图做的

<asp:DetailsView ID="DVComplain" runat="server" 
        DefaultMode="Insert" AutoGenerateInsertButton="True" 
        AutoGenerateRows="False" DataSourceID="ODSAddWorkOrder" 
        oniteminserting="DetailsView1_ItemInserting" >
        <Fields>
            <asp:TemplateField HeaderText="Complain">
               <InsertItemTemplate>
                   <asp:DropDownList ID="DDLComplain" runat="server" DataTextField="ComplainID" 
                       DataValueField="ComplainID" DataSourceID="EDSComplains" 
                       oninit="DDLComplain_Init">
                   </asp:DropDownList>
                   <asp:CheckBox ID="CBIsWOOfComplain" runat="server" 
                       oninit="CBIsWOOfComplain_Init" />
                   <asp:EntityDataSource ID="EDSComplains" runat="server" 
                       ConnectionString="name=MMEntities" DefaultContainerName="MMEntities" 
                       EnableFlattening="False" EntitySetName="ComplainMasters" 
                       EntityTypeFilter="ComplainMaster" Select="it.[ComplainID]" OrderBy="it.ComplainID">
                   </asp:EntityDataSource>
               </InsertItemTemplate>
            </asp:TemplateField>
            <asp:BoundField HeaderText="WOGeneratedDate" DataField="WOGeneratedDate" DataFormatString="yyyy-MM-dd" />
            .......
        </Fields>
    </asp:DetailsView>

   <asp:ObjectDataSource ID="ODSAddWorkOrder" runat="server"
        DataObjectTypeName="MiantenanceManager.DAL.WorkOrder" TypeName="MiantenanceManager.BLL.WorkOrderBL"
        InsertMethod="addWorkOrder">
    </asp:ObjectDataSource>
注意:ComplinBl实现IDispose。 在WorkRederbl调用中,它调用WorkOrderRepository类,该类调用以下方法,该方法在主题中抛出异常

context.WorkOrder.AddObject(WorkOrder); SaveChanges()


我怎样才能克服这个问题。是我的方法错了吗

之所以出现此错误,是因为添加对象是为了添加新对象。具有实体键的对象表示数据库中的现有行。这假设您正在为表使用数据库生成的键

有不同的修复方法,例如:

  • 选项1:从数据库获取记录,更新该记录上的字段,然后保存更改
  • 选项2:使用实体键创建一个新对象,将其附加到状态已修改的上下文中,然后保存更改

您收到此错误的原因是添加对象是为了添加新对象。具有实体键的对象表示数据库中的现有行。这假设您正在为表使用数据库生成的键

有不同的修复方法,例如:

  • 选项1:从数据库获取记录,更新该记录上的字段,然后保存更改
  • 选项2:使用实体键创建一个新对象,将其附加到状态已修改的上下文中,然后保存更改

亲爱的设拉子,您所说的“具有实体键的对象是现有对象”是什么意思?如果我使用attach而不是AddObject,我会得到以下错误。“具有临时EntityKey值的对象无法附加到对象上下文”仅当我执行e.Values[“投诉”]=complainBL.getComplianByID(_DDLComplains.SelectedValue)时,我才会收到此原始错误;在DetailView中的ItemAdding方法中。@user1147173,很好,我更新了它,希望这次它会更有意义亲爱的Shiraz,你说“具有实体键的对象是现有对象”是什么意思?如果我使用attach而不是AddObject,我会得到以下错误。“具有临时EntityKey值的对象无法附加到对象上下文”仅当我执行e.Values[“投诉”]=complainBL.getComplianByID(_DDLComplains.SelectedValue)时,我才会收到此原始错误;在DetailView中的ItemAdding方法中。@user1147173,捕捉得好,我更新了它,希望这次它会更有意义
    protected void DVWorkOrder_ItemInserting(object sender, DetailsViewInsertEventArgs e)
            {
                if (_CBIsWOOfComplain.Checked)
                {
                    using (complainBL)
                    {                    
                        e.Values["Complain"] = complainBL.getComplianByID(_DDLComplains.SelectedValue);
                    }
                }
            }