【发布时间】: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.LinkButton.OnCommand(CommandEventArgs e) +121 System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(字符串 eventArgument)+156 System.Web.UI.WebControls.LinkButton.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.galleryItem或newFile.galleryItem。 -
我还是 Entity Framework 的新手,但我认为它会自动加载 galleryItem。在上面添加了 GalleryItemFile 模型。我应该补充一下,我使用的是代码优先方法。
-
好的,试试 public virtual GalleryItem。 (使 EF 能够进行延迟加载)。
标签: asp.net entity-framework gridview objectdatasource