【问题标题】:ASP.NET GridView Update using Entity Framework and ObjectDataSource使用 Entity Framework 和 ObjectDataSource 的 ASP.NET GridView 更新
【发布时间】:2014-02-21 20:10:26
【问题描述】:

我是 Entity Framework 和 ObjectDataSource 的新手。我正在尝试让我的网格更新项目,但出现以下错误。我做错了什么?

“/”应用程序中的服务器错误。 你调用的对象是空的。 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。 异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。 源错误: 在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。 堆栈跟踪: [NullReferenceException:对象引用未设置为对象的实例。] GalleryApp.Logic.FileActions.UpdateFile(GalleryItemFile newFile) +377 [TargetInvocationException:调用的目标已引发异常。] System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) +0 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(对象 obj,对象 [] 参数,对象 [] 参数)+92 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] 参数, CultureInfo 文化) +108 System.Web.UI.WebControls.ObjectDataSourceView.InvokeMethod(ObjectDataSourceMethod 方法,布尔 disposeInstance,Object& 实例)+487 System.Web.UI.WebControls.ObjectDataSourceView.InvokeMethod(ObjectDataSourceMethod 方法)+39 System.Web.UI.WebControls.ObjectDataSourceView.ExecuteUpdate(IDictionary 键,IDictionary 值,IDictionary oldValues)+1830 System.Web.UI.DataSourceView.Update(IDictionary 键、IDictionary 值、IDictionary oldValues、DataSourceViewOperationCallback 回调)+87 System.Web.UI.WebControls.GridView.HandleUpdate(GridViewRow row, Int32 rowIndex, Boolean CauseValidation) +1210 System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean CauseValidation, String validationGroup) +738 System.Web.UI.WebControls.GridView.OnBubbleEvent(对象源,EventArgs e)+89 System.Web.UI.Control.RaiseBubbleEvent(对象源,EventArgs args)+37 System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(对象源,EventArgs e)+88 System.Web.UI.Control.RaiseBubbleEvent(对象源,EventArgs args)+37 System.Web.UI.WebControls.LinkBut​​ton.OnCommand(CommandEventArgs e) +121 System.Web.UI.WebControls.LinkBut​​ton.RaisePostBackEvent(字符串 eventArgument)+156 System.Web.UI.WebControls.LinkBut​​ton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(字符串 eventArgument)+10 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +9642610 System.Web.UI.Page.ProcessRequestMain(布尔 includeStagesBeforeAsyncPoint,布尔 includeStagesAfterAsyncPoint)+1724 版本信息:Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.18056

这是我的 ASPX 代码。

<asp:GridView runat="server" DataSourceID="dsFiles" ID="gvFiles" 
        EmptyDataText="No Files Associated with this gallery item yet."
        DataKeyNames="fileID,galleryItem" AutoGenerateColumns="false" CssClass="formtable" OnRowUpdating="gvFiles_RowUpdating">
        <Columns>
            <asp:BoundField HeaderText="filename" DataField="filename" />
            <asp:TemplateField HeaderText="File Type" SortExpression="fileType">
                <ItemTemplate>
                    <%# Eval("FileType.fileType")  %>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList runat="server" ID="cboFileType" DataSourceID="dsFileTypes" DataTextField="fileType" DataValueField="fileTypeID" SelectedValue='<%# Eval("FileType.fileTypeID") %>' />
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:DropDownList runat="server" ID="cboFileType" DataSourceID="dsFileTypes" DataTextField="fileType" DataValueField="fileTypeID" SelectedValue='<%# Bind("FileType.fileTypeID") %>' />
                </InsertItemTemplate>
            </asp:TemplateField>
            <asp:BoundField HeaderText="Active" DataField="active" />
            <asp:BoundField HeaderText="Resolution" DataField="resolution" />
            <asp:CommandField ShowDeleteButton="true" ShowEditButton="true" ShowHeader="true" />
        </Columns>
    </asp:GridView>

    <asp:ObjectDataSource runat="server" ID="dsFiles"
        TypeName="GalleryApp.Logic.FileActions"
        DataObjectTypeName="GalleryApp.Models.GalleryItemFile"
        SelectMethod="GetFiles"
        InsertMethod="AddFile"
        UpdateMethod="UpdateFile"
        DeleteMethod="DeleteFile" OnUpdating="dsFiles_Updating">
        <SelectParameters>
            <asp:ControlParameter Name="galleryItemID" ControlID="hidGalleryItemID" Type="Int32" />
        </SelectParameters>
        <InsertParameters>
            <asp:ControlParameter Name="galleryItemID" ControlID="hidGalleryItemID" Type="Int32" />
            <asp:Parameter Name="fileTypeID" Type="Int32" />
            <asp:Parameter Name="filename" Type="String" />
            <asp:Parameter Name="active" Type="Boolean" />
            <asp:CookieParameter Name="userCommonName" Type="String" />
            <asp:Parameter Name="resolution" Type="String" />
        </InsertParameters>
        <UpdateParameters>
            <asp:Parameter Name="fileID" Type="Int32" />
            <asp:ControlParameter Name="galleryItemID" ControlID="hidGalleryItemID" Type="Int32" />
            <asp:Parameter Name="fileTypeID" Type="Int32" />
            <asp:Parameter Name="filename" Type="String" />
            <asp:Parameter Name="active" Type="Boolean" />
            <asp:CookieParameter Name="userCommonName" Type="String" />
            <asp:Parameter Name="resolution" Type="String" />
        </UpdateParameters>
        <DeleteParameters>
            <asp:Parameter Name="fileID" Type="Int32" />
        </DeleteParameters>
    </asp:ObjectDataSource>

    <asp:ObjectDataSource runat="server" ID="dsFileTypes"
        TypeName="GalleryApp.Logic.FileTypeActions"
        DataObjectTypeName="GalleryApp.Models.FileType"
        SelectMethod="GetFileTypes">
    </asp:ObjectDataSource>

FileActions 是我的逻辑类。我将所有方法都切换为静态,因为我在一个示例中看到了这一点,但它并没有改变任何东西。我认为它一定是在谈论作为实体之一的 GalleryItemFile 对象。

网格加载单击编辑然后更改文件名并单击保存,我得到黄屏。

编辑: 这是被调用的函数。异常发生在第一个“else”之后的行。

public static GalleryItemFile UpdateFile(GalleryItemFile newFile)
    {
        GalleryContext _db = new GalleryContext();

        _db.Database.Log = HttpContext.Current.Response.Write; //Used for Tracing SQL
        int saved = 0;

        GalleryItemFile origFile = _db.GalleryItemFiles.FirstOrDefault(g => g.fileID == newFile.fileID);
        HttpContext.Current.Response.Write(origFile.filename);
        if (origFile == null)
        {
            //ITEM NOT FOUND
        }
        else
        {
            origFile.galleryItem.galleryItemID = newFile.galleryItem.galleryItemID;
            origFile.fileType.fileTypeID = newFile.fileType.fileTypeID;
            origFile.filename = newFile.filename;
            origFile.active = newFile.active;
            origFile.createdOn = DateTime.Now;
            origFile.createdBy = newFile.createdBy;
            origFile.resolution = newFile.resolution;

            saved = _db.SaveChanges();
        }


        if (saved > 0)
        {
            return origFile;
        }
        else { return null; }
    }

在调试时,我确认 origFile 已正确检索。它是从似乎生成空引用的 ObjectDataSource 发送的 newFile。

编辑: 这是 GalleryItemFile 的模型。

我还是 Entity Framework 的新手,但我认为它会自动加载 galleryItem。

namespace GalleryApp.Models
{
[Serializable]
public class GalleryItemFile
{
    [Key]
    public int fileID { get; set; }
    public virtual GalleryItem galleryItem { get; set; }
    public virtual FileType fileType { get; set; }
    [MaxLength(75)] public string filename { get; set; }
    public bool active { get; set; }
    public DateTime? createdOn { get; set; }
    [MaxLength(150)] public string createdBy { get; set; }
    [MaxLength(50)] public string resolution { get; set; }

}
}


namespace GalleryApp.Models
{
[Serializable]
public class FileType
{
    [Key]
    public int fileTypeID { get; set; }
    [MaxLength(50)] public string fileType { get; set; }
    [MaxLength(15)] public string extension { get; set; }
    [MaxLength(250)] public string icon { get; set; }
    [MaxLength(400)] public string description { get; set; }
    [MaxLength(400)] public string warnings { get; set; }

}
}
“/”应用程序中的服务器错误。 你调用的对象是空的。 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。 异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。 源错误: 第 160 行:{ 第 161 行:origFile.galleryItem.galleryItemID = newFile.galleryItem.galleryItemID; 第 162 行:origFile.fileType.fileTypeID = newFile.fileType.fileTypeID; 第 163 行:origFile.filename = newFile.filename; 第 164 行:origFile.active = newFile.active; 源文件:c:\Users\holcombelr\SkyDrive\Public\Projects\UHV\GalleryApp\Logic\GalleryItemFileActions.cs 行:162 堆栈跟踪: [NullReferenceException:对象引用未设置为对象的实例。] GalleryApp.Logic.FileActions.UpdateFile(GalleryItemFile newFile) 在 c:\Users\holcombelr\SkyDrive\Public\Projects\UHV\GalleryApp\Logic\GalleryItemFileActions.cs:162

这里有更多信息。添加可序列化让我更近了一步,但现在错误出现在下一行,我现在已将可序列化添加到我的所有对象中。

编辑:有人对此有答案吗?我还是有这个问题。

【问题讨论】:

  • 您是否尝试过调试代码以查看导致错误的语句?
  • 我已经编辑了上面的内容以显示我的调试结果。再次,似乎 ObjectDataSource 没有将 GalleryItemFile 对象发送回 UpdateFile 方法。
  • 您必须检查哪个对象为空。它不是newFile,因为它已经被访问了几行,所以它必须是origFile.galleryItemnewFile.galleryItem
  • 我还是 Entity Framework 的新手,但我认为它会自动加载 galleryItem。在上面添加了 GalleryItemFile 模型。我应该补充一下,我使用的是代码优先方法。
  • 好的,试试 public virtual GalleryItem。 (使 EF 能够进行延迟加载)。

标签: asp.net entity-framework gridview objectdatasource


【解决方案1】:

我想我明白了。显然,当您有这样的子对象时,您必须将对象包含在 gridview 的 DataKeyNames 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    相关资源
    最近更新 更多