1

私は現在EntityFrameworkを使用しており、データベースのレコードのリストを表示するGridviewがあります。[削除]コマンドを使用する[削除]ボタンがあります。各レコードにはサーバー上に関連付けられたファイルがあるため、データソースが削除イベントを発生させたときに、ファイル名を取得してサーバーからもファイルを削除します。奇妙なことに、私のds_Deletingイベントでは、エンティティの値の一部がnullになっています。理由がわからないようです。

グリッドビューの[削除]ボタンのコードは次のとおりです。

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

GridViewに正しく表示されていても、contract.FileNameの値がnullになるたび。どんな助けでも大歓迎です。ありがとう!

4

3 に答える 3

3

私はこれを理解することができたので、他の誰かが同じ問題を抱えている場合に備えて、ここに書き留めておくことにしました. エンティティ データ ソースの削除イベントに関する MSDN のドキュメントを確認したところ (ここにあります)、次のように書かれていました。

EntityDataSourceChangingEventArgs オブジェクトの Entity プロパティを使用して、削除するオブジェクトにアクセスします。このオブジェクトのプロパティが完全に設定されていない可能性があります。オブジェクトを識別するために必要なプロパティのみを設定する必要があります。

これが、null 値を取得していた理由です。私が思いついた解決策はおそらく理想的ではありませんが、うまくいきます。主キーの 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));
    }
}
于 2011-09-27T13:57:28.943 に答える
1

ASP.NET 動的データ リスト ページでこれを経験し、varchar 外部キーにバグがあるように見えること (Microsoft が受け入れていると思います) を考えると、どのような解決策も回避策 (ハック) になります。

デフォルト値 (createdDate、CreatedBy など) を持つテーブル列の null 値を回避するために、関係するエンティティの部分クラスのコンストラクターでデフォルト値を設定することになりました。

上記の情報から、エンティティを一意に識別するために必要な列のみが読み込まれるという手がかりが得られた後、問題 (外部キー) 列に別の「デフォルト」値を追加すると問題が解決することがわかりました。つまり、カスケードがないためです。エンティティの主キーは削除を実行するのに十分であり、外部キー (varchar) の null 値をチェックするのは他の処理であるため、コンストラクターでその列を String.Empty に設定するだけです。私が設定したデフォルト値は無視されます...

例えば

public partial class MyEntity
{

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

出来上がり!

于 2012-03-20T03:02:12.180 に答える
0

コードビハインドでアクセスしたいプロパティをオブジェクトにバインドするだけです。

Hidden オブジェクトを使用して TemplateField を追加し、使用する値を次のようにバインドできます。

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

于 2012-02-27T16:57:51.017 に答える