当entitydatasource Deleting Event引发时,实体中的空值

本文关键字:实体 空值 entitydatasource Deleting Event | 更新日期: 2023-09-27 18:09:37

我目前正在使用实体框架,我有一个Gridview显示从数据库的记录列表。我有一个删除按钮,使用删除命令。每条记录在服务器上都有一个与之关联的文件,因此当数据源引发删除事件时,我希望获取文件名并从服务器上删除该文件。奇怪的是,在我的ds_Deleting事件中,实体中的一些值是空的。我似乎不明白为什么。

gridview中Delete按钮的代码如下:

<asp:TemplateField HeaderText="Remove">
    <ItemTemplate>
        <asp:Button ID="btnRemove" runat="server" Text="Remove" CssClass="button_default" CommandName="Delete" OnClientClick="return confirm('Deleting this contract will also delete the file from the server. Continue?')" />
     </ItemTemplate>
 </asp:TemplateField>

隐藏代码中的OnDeleting事件如下所示:

protected void dsContracts_Deleting(object sender, EntityDataSourceChangingEventArgs e)
{
    ipiModel.Contract contract = (ipiModel.Contract)e.Entity;
    File.Delete(Path.Combine(ConfigurationManager.AppSettings["ContractUploadPath"], contract.FileName));
}

每次合同。FileName值为空,即使它在GridView中正确显示。任何帮助都将非常感激。谢谢!

当entitydatasource Deleting Event引发时,实体中的空值

我设法弄清楚了这个问题,并决定在这里写下它,以防其他人有同样的问题。我检查了MSDN上的实体数据源删除事件的文档(可以在这里找到),它说

EntityDataSourceChangingEventArgs对象的Entity属性用于访问要删除的对象。此对象的属性可能未完全设置。只需要设置标识对象所需的属性。

这就是为什么我得到空值。我提出的解决方案可能不是理想的,但它有效。我意识到主键contracd总是有一个值,所以我使用它从数据库中提取记录。下面是我的代码:

protected void dsContracts_Deleting1(object sender, EntityDataSourceChangingEventArgs e)
{
    ipiModel.Contract ct = (ipiModel.Contract)e.Entity;
    using (var db = new ipiModel.ipiEntities())
    {
        var contract = db.Contracts.Where(c => c.ContractID == ct.ContractID).Single();
        File.Delete(Path.Combine(ConfigurationManager.AppSettings["ContractUploadPath"], contract.FileName));
    }
}

在ASP中有过这样的经历。NET动态数据列表页面,并且考虑到varchar外键似乎存在错误(我相信微软接受),任何解决方案都将是一种变通(hack)。

为了工作周围的空值与默认值的表列(例如createdDate, CreatedBy等),我已经结束了在一个部分类的有关实体的构造函数中设置默认值。

后上面的信息给了线索,只有唯一标识实体加载所需的列,我发现添加另一个默认的值问题(外键)列固定我的问题——例如,因为我没有级联删除或其他实体的主键足以做删除,其他处理,检查null值的外键(varchar)——所以我简单地设置列字符串。在构造函数中为空,并且忽略我设置的默认值…

public partial class MyEntity
{
    public MyEntity()
    {
        CreatedDate = Datetime.Now;
        //Other default stuff
        MyProblemVarcharForeignKeyField = String.Empty;
    }
}

等。瞧!

你所要做的就是在后面的代码中将你想要访问的属性绑定到一个对象。

你可以添加一个带有隐藏对象的TemplateField,并像这样绑定你想要使用的值:

<asp:TemplateField HeaderText="Remove">
<ItemTemplate>
    <asp:HiddenField ID="HiddenField1" runat="server" value='<%# Bind("FileName") %>'/>
 </ItemTemplate>