asp:EntityDataSource无法更新或删除gridview

时间:2012-11-16 22:19:15

标签: asp.net entity-framework

我有供应商出价的gridview,其中包含供应商表和产品表的外键。

这是我的gridview和我的数据源。

<table>
    <asp:GridView ID="GridViewVendorBids" runat="server" AutoGenerateColumns="False"
        DataSourceID="VendorBidsDS" DataKeyNames="autRecNum" ForeColor="#333333" CellPadding="4"
        GridLines="None" AllowPaging="True" AllowSorting="True">
        <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
        <Columns>
            <asp:CommandField ShowEditButton="true" />
            <asp:BoundField DataField="dtmBidDate" HeaderText="Bid Date" SortExpression="dtmBidDate"
                DataFormatString="{0:MM/dd/yyyy}" ApplyFormatInEditMode="true" />
            <asp:TemplateField HeaderText="Vendor Name" SortExpression="it.tblVendors.strVendorName">
                <ItemTemplate>
                    <asp:Label ID="lblVendorName" runat="server" Text='<%# Eval("tblVendors.strVendorName") %>' />
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList ID="ddlVendorList" runat="server" DataTextField="strVendorName"
                        DataSource='<%# getVendorList() %>' DataValueField="strVendorCode" AutoPostBack="false"
                        SelectedValue='<%# Bind("strVendorCode") %>' DropDownStyle="DropDownList" AutoCompleteMode="SuggestAppend"
                        CssClass="comboBoxInsideModalPopup" Width="250px" MaxLength="0" Style="display: inline;
                        top: 0px; left: 0px;" ItemInsertLocation="Append" RenderMode="Inline" Height="16px" />
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Product Name" SortExpression="it.tblProducts.strProductName">
                <ItemTemplate>
                    <asp:Label ID="lblProductName" runat="server" Text='<%# Eval("tblProducts.strProductName") %>' />
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList ID="ddlProductList" runat="server" DataTextField="strProductName"
                        DataSource='<%# getProductList() %>' DataValueField="strProductCode" AutoPostBack="false"
                        SelectedValue='<%# Bind("strProductCode") %>' DropDownStyle="DropDownList" AutoCompleteMode="SuggestAppend"
                        CssClass="comboBoxInsideModalPopup" Width="300px" MaxLength="0" Style="display: inline;
                        top: 0px; left: 0px;" ItemInsertLocation="Append" RenderMode="Inline" Height="16px" />
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Unit" SortExpression="it.tblProducts.strUnitDesc">
                <ItemTemplate>
                    <asp:Label ID="lblUnitDesc" runat="server" Text='<%# Eval("tblProducts.strUnitDesc") %>' />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="sngBid" HeaderText="Bid" SortExpression="sngBid" ItemStyle-HorizontalAlign="Right"
                DataFormatString="{0:0.00}" />
            <asp:BoundField DataField="strBidType" HeaderText="Bid Type" SortExpression="strBidType"
                ReadOnly="true" />
            <asp:CommandField ShowDeleteButton="true" />
        </Columns>
    </asp:GridView>
</table>
<asp:EntityDataSource ID="VendorBidsDS" runat="server" ConnectionString="name=IMSEntities"
    DefaultContainerName="IMSEntities" EntitySetName="tblVendorBid" Include="tblVendors,tblProducts"
    EnableFlattening="False" OrderBy="it.dtmBidDate DESC" EnableDelete="true" EnableUpdate="true">
</asp:EntityDataSource>

当我按下更新或删除键时,我收到以下错误:

在更新或删除操作期间未找到任何键属性值。检查以确保指定为绑定表达式的键属性可用于数据源。

我发现this post与我的问题非常相似,但当我尝试答案时,我仍然得到同样的错误。

感谢任何帮助。感谢。

3 个答案:

答案 0 :(得分:0)

对于实体数据源,您需要一个table.it的主键,允许您更改记录...添加主键后,右键单击实体数据源&amp;选择更新数据库

答案 1 :(得分:0)

“autRecNum”是VendorBidsDS表的唯一主键吗? 您可以检查数据源配置是否正确设置了主键和外键。如果另一个表未更新,您也可以检查FKey的删除/更新规则是否设置为Cascade。 并在“SelectedValue ='&lt;%#Bind(”strProductCode“)%&gt;' “,”strProductCode“应该是实体属性而不是数据库列。 这是我很久以前从我以前的项目中记住的几点。 希望它可以帮到你。

答案 2 :(得分:0)

我收到了“未找到关键属性值...”错误,因为我试图将两次保存回EntityDataSource而没有有效的主键。 StoreGeneratedPattern设置已正确设置为Identity,并且第一个Insert正确运行,但后续更新失败 - 可能是因为尚未设置主键。

基本上我手动插入一行(使用DbContext)并运行context.SaveChanges()但是我的Telerik Grid翻译了按钮的“更新”CommandName以运行另一个更新插入后命令,导致此错误。更新现有行时不会发生错误,因此很可能与新插入的行的主键相关。

要解决此问题,我只需将按钮的CommandName设置为“取消”即可。我的手动插入/更新仍然运行,但网格不会尝试其他更新操作并正确关闭我正在编辑的行。