2011-09-26 39 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; 
    } 
} 

,瞧!

相關問題