在EntityObject派生类中使用自定义属性的GridView绑定在ASP.NET中失败

时间:2013-04-19 12:36:56

标签: asp.net entity-framework c#-4.0

我有一个实体框架层,我从该层扩展了一个类。代码如下:

public partial class FeatureMaster : EntityObject
{
    public string ParentFeatureName
    {
        get
        {
            return (from r in Global.dc.FeatureMasters
                    where r.FeatureId == FeatureParentId
                    select r).SingleOrDefault().FeatureName;
        }
        set
        {
            FeatureParentId = (from r in Global.dc.FeatureMasters
                               where r.FeatureName == value
                               select r).SingleOrDefault().FeatureId;
            ReportPropertyChanged(("ParentFeatureName"));
            ReportPropertyChanged(("FeatureParentId"));
        }
    }
}

现在我希望在我的ASP.NET页面中使用相同的内容。我的ASP.NET页面的代码是:

    <%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true"
    CodeBehind="ListFeatureMaster.aspx.cs" Inherits="Backend.ListFeatureMaster" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="cpMain" runat="server">
    <asp:GridView ID="grdRecords" runat="server" AllowPaging="True" AllowSorting="True"
        AutoGenerateColumns="False" DataKeyNames="FeatureId" DataSourceID="EntityDataSource1">
        <Columns>
            <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
            <asp:BoundField DataField="FeatureId" HeaderText="FeatureId" ReadOnly="True" SortExpression="FeatureId" />
            <asp:BoundField DataField="FeatureName" HeaderText="FeatureName" SortExpression="FeatureName" />
            <asp:BoundField DataField="FeatureParentId" HeaderText="FeatureParentId" SortExpression="FeatureParentId" />
            <asp:BoundField DataField="FeatureDescription" HeaderText="FeatureDescription" SortExpression="FeatureDescription" />
            <asp:TemplateField HeaderText="ParentFeatureName" SortExpression="ParentFeatureName">
                <EditItemTemplate>
                    <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="EntityDataSource1"
                        AppendDataBoundItems="true" DataTextField="ParentFeatureName" DataValueField="ParentFeatureName"
                        SelectedValue='<%# Bind("ParentFeatureName") %>'>
                    </asp:DropDownList>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Eval("ParentFeatureName") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    <asp:EntityDataSource ID="EntityDataSource1" runat="server" ConnectionString="name=BackendEntities"
        DefaultContainerName="BackendEntities" EnableFlattening="False" EntitySetName="FeatureMasters"
        EntityTypeFilter="FeatureMaster" EnableDelete="True" EnableUpdate="True">
    </asp:EntityDataSource>
        <asp:EntityDataSource ID="EntityDataSource2" runat="server" ConnectionString="name=BackendEntities"
        DefaultContainerName="BackendEntities" EnableFlattening="False" EntitySetName="FeatureMasters"
        EntityTypeFilter="FeatureMaster" EnableDelete="True" EnableUpdate="True">
    </asp:EntityDataSource>
</asp:Content>

问题在于,当我执行此代码时,它在第一次加载和导航时运行良好,但是当我尝试更新记录时,我收到错误。请帮我解决一下。

错误消息说:

A property named 'ParentFeatureName' was not found on the entity during an insert, update, or delete operation. Check to ensure that properties specified as binding expressions are available to the data source.

2 个答案:

答案 0 :(得分:1)

我认为问题是您没有将自定义属性附加到您的实体,然后保存它。你可以看看Adding customer property to entity class

希望它有所帮助。

答案 1 :(得分:0)

我得到了解决方案。

我更改了GridView的定义并添加了OnRowUpdating事件。 ASPX页面代码现在看起来像:

<asp:GridView ID="grdRecords" runat="server" AllowPaging="True" AllowSorting="True"
    AutoGenerateColumns="False" DataKeyNames="FeatureId" DataSourceID="EntityDataSource1" OnRowUpdating="grdRecords_RowUpdating">

在我的.aspx.cs文件中,我添加了Event Handler的代码。相同的代码如下所示:

        protected void grdRecords_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        int primaryKey = Convert.ToInt32(grdRecords.DataKeys[e.RowIndex].Value);

        FeatureMaster existingRecord = Global.dc.FeatureMasters.First(r => r.FeatureId == primaryKey);
        existingRecord.FeatureName = e.NewValues["FeatureName"].ToString();
        existingRecord.ParentFeatureName = ((DropDownList)(grdRecords.Rows[e.RowIndex].FindControl("DropDownList1"))).SelectedValue.ToString();
        existingRecord.FeatureDescription = e.NewValues["FeatureDescription"].ToString();

        Global.dc.SaveChanges();

        grdRecords.EditIndex = -1;

        e.Cancel = true;
    }