誤解か、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フォームに通知するだけでした。