2011-09-26 63 views
1

我目前正在使用实体框架,我有一个GridView显示数据库中的记录列表。我有一个删除按钮,使用删除命令。每个记录都在与之关联的服务器上有一个文件,所以当数据源引发删除事件时,我想抓取文件名并从服务器中删除文件。奇怪的是,在我的ds_Deleting事件中,实体中的一些值为空。我似乎无法弄清楚为什么。entitydatasource删除事件引发时在实体中的空值

我在GridView中删除按钮的代码如下:

<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)); 
} 

每次contract.FileName值为null即使它在GridView中正确显示。任何帮助将非常感激。谢谢!

回答

3

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

的EntityDataSourceChangingEventArgs对象的实体属性用于访问该对象被删除。此对象的属性可能未完全设置。只有标识对象所需的属性必须设置。

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

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)); 
    } 
} 
0

您所要做的就是将您想要在代码中访问的属性绑定到对象。

您可以添加与隐藏的对象一个TemplateField和绑定您要使用他们这样的价值观:

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

1

具有带有ASP.NET动态数据列表页遇到过,和考虑到似乎有一个与varchar外键错误(Microsoft认为我接受),任何解决方案将是一种解决方法(黑客)。

为了解决具有默认值的表列的空值(例如createdDate,CreatedBy等),我最终在相关实体的部分类的构造函数中设置了默认值。

当上面的信息给出了只有列需要唯一标识实体的线索加载后,我发现为问题(外键)列添加另一个'默认'值修复了我的问题 - 也就是说,没有任何级联删除或其他任何东西,实体的主键足以执行删除操作,而其他处理是检查外键(varchar)中的空值 - 因此我只是将该列设置为String.Empty构造函数和默认值I set被忽略...

eg

public partial class MyEntity 
{ 

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

,瞧!

相关问题