0

誤解か、EntityFramworkのバグのように見える問題が発生しています。

.NET 4.0 ASP.NET Webプロジェクトがあり、一部の列のみが選択されたEntityFrameworkビューオブジェクトのデータソースでGridViewを使用するだけです。

Entity Frameworkは、SQL Server2008R2のデータベースモデルに基づいています。テーブルのデザインは、ほとんどが第3正規形です。

関連するオブジェクトのクイックデータベーススキーマ:

[t_User] UserID、bigint、PK FirstName、varchar(50)LastName、varchar(50)

[t_Manager] MgrID、int、PK UserID、bigint、FK

[v_Manager] MgrID、int UserID、bigint FirstName、varchar(50)LastName、varchar(50)

テーブルをインポートしてEFモデルに表示すると、v_ManagerからMgrIDにPKが割り当てられました。これは問題ないと思います。

v_Managerは、v_Managerエンティティを使用してEFモデルとして設定されたデータソースを使用してASPXGridViewコントロールを駆動するものです。

GridViewは、フッターのCreateNew行コマンドが機能しているので、私が持っている方法で正常に機能します。

GridView RowDeletingトリガーを使用してレコードを削除すると、問題が発生します。コードは次のようになります。

protected void MgrsGrid_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
    // parse userId
    long mgrSelected = long.Parse(e.Values[0].ToString());

    using (DBEntity db = new DBEntity())
    {
        // select mgr object based on userid, (we don't select mgrid for the gridview bind)
        var mgrToDelete = db.t_Manager.Single(m => m.UserID == mgrSelected);

        if (mgrToDelete != null)
        {
            db.DeleteObject(mgrToDelete);
            db.SaveChanges();
            MgrGrid.DataBind();
        }
    }
}

RowDeleting()のすべてのコードをステップ実行すると、動作して実際にレコードが削除されます(SSMSで確認済み)が、EFコードを実行すると、ページのレンダリング時に次のエラーが発生します。

EntitySet'v_Manager'にはDefiningQueryがあり、現在の操作をサポートする要素が要素に存在しないため、更新できません。

私はv_Managerを更新したり、そこから何も削除したりしようとはしていません。t_Managerを使用しています。受け取ったエラーに対してスタック検索とGoogle検索を実行し、edmxファイルを手動で更新してDefiningQueryを削除しましたが、SQL Server 2008から直接、v_Managerからレコードを削除できないというエラーメッセージが表示されます。複数のテーブル。

ここで何かが足りませんか?t_Managerエンティティからレコードを削除してSaveChanges()を呼び出すと、SQL Serverがv_ManagerエンティティでRefresh()を実行するだけだと思いますか?

v_Managerエンティティを使用してGridViewを駆動する必要がありますが、GridViewをt_Managerに対してバインドするように変更した場合、問題は発生しないのではないかという疑いがあります。

この問題は、v_Managerによって駆動されるGridViewがRowDeletingイベントをトリガーすると、GridViewsデータソースに対して削除が実行されることに起因するようです。

その動作をオーバーライドする方法はありますか、それともこれは設計によるものですか?そうであれば、ビュー(ほとんどのデータベースが利用する)を操作するときにEntity Frameworkが役立つと思う方法はありますか?

誰もが提供できる支援に感謝します、ありがとう!

編集:EnableDeleteフラグをfalseに設定しようとしましたが、GridViewの削除リンクをクリックしたときにデータソースが削除を許可しないことをWebフォームに通知するだけでした。

4

1 に答える 1

1

redditのTobiasFunkeMDは、これに対するすべてのクレジットに値します(ありがとう!) Reddit Link

e.Cancel=true;を追加するだけです。GridView.DataBind();の後

例:

db.DeleteObject(mgrToDelete);
db.SaveChanges();
MgrGrid.DataBind();

e.Cancel = true;

これは、e.CancelBubblingを使用する場合のjavascriptの場合と同じように機能します。基本的に、イベントがチェーンの上位に続くのを防ぎます。

Entity Frameworkは正常に機能していました。問題は、RowDeleting関数で何が行われているかに関係なく、GridViews独自のRowDeletingイベントが常にGridViews独自のデータソースに反することでした。

于 2012-07-06T05:43:41.140 に答える