我正在使用带有ObjectDataSource的实体框架的n层Web应用程序。 在我的网络应用程序中有Complains&具有多对一或零关系的WorkOrder实体。
添加WorkOrder后,用户可以选择投诉。这是我试图做的。
<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>
并将以下代码添加到DetailView ItemInserting方法。
protected void DVWorkOrder_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
if (_CBIsWOOfComplain.Checked)
{
using (complainBL)
{
e.Values["Complain"] = complainBL.getComplianByID(_DDLComplains.SelectedValue);
}
}
}
注意:complainBL实现了IDispose。 在WorkOrederBL中,它调用它调用WorkOrderRepository类,该类调用以下方法,该方法在主题中引发异常提及。
context.WorkOrder.AddObject(工作单); context.SaveChanges();
我怎样才能克服这个问题。我的approch错了吗?
答案 0 :(得分:1)
你得到这个问题的原因是AddObject用于添加新对象。具有实体键的对象表示数据库中的现有行。这假设您正在为表使用数据库生成的密钥。
有不同的方法可以解决它,例如: