2016-04-22 22 views
8

私は、別のデータベースから顧客の詳細を取得するビューにリンクされたCustomerテーブルを含むモデルファーストエンティティモデルを持っています。 CustomerテーブルとViewの間には1対多の関係があり、CustomerエンティティとViewエンティティの両方にナビゲーションプロパティがあります。ビューベースのエンティティへの1対多の関連付けによるエンティティオブジェクトの削除

私は削除使用してcontext.Customers.DeleteObject(CUST)を実行し、(context.SaveChangesを呼び出そう)私はエラーを取得する:

Unable to update the EntitySet 'ViewEntity' because it has a DefiningQuery and no [DeleteFunction] element exists element to support the current operation.


私がON DELETE CASCADEを設定して、試してみましたどちらも同じエラーを生成しません。

EDITは:表示する多くのコードはありませんが、ここであなたが行く:SO @Overmachineに同意で

Customer selectedCust = (Customer)dgvCustomers.SelectedRows[0].DataBoundItem; 
if (selectedCust != null) 
{ 
    if (MessageBox.Show(String.Format("Are you sure you want to delete Customer {0}?", selectedCust.CustomerID.ToString()), 
          "Customer Delete Confirmation", MessageBoxButtons.YesNo) == DialogResult.Yes) 
    { 
     // TODO - Fix this 
     this.ReportSchedDBContext.Customers.DeleteObject(selectedCust); 
     this.ReportSchedDBContext.SaveChanges();      
    } 
} 
+1

あなたのコードの仲間を見せてください –

+1

エンティティとテーブルに主キーがありますか? – Overmachine

+0

実テーブル(Customer)に基づくエンティティは、ビューに基づいているため、ビューベースエンティティはありません。 – Overhed

答えて

1

私は何もしないダミーのストアドプロシージャを作成することで、この問題を回避することができました( "SELECT 'Done'")、2つのビューでSP関数マッピングを使用して、このストアドプロシージャにDelete関数を設定します。かなりのハックだが、うまくいった。

私はなぜ、ビューに削除機能が必要なのか、私が問題を引き起こした何か間違ったことをしているのか分かりませんが、上記は私にとってはうまくいったのです。

1

多くの関連記事を...おそらくあなたのエンティティ/テーブルの主キーが欠落しています。

..

because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element

Unable to update the EntitySet - because it has a DefiningQuery and no <UpdateFunction> element exist


EDIT

はちょうどあなたについてあなたのコメントを見てください主キーは持っていますが、ビューは表示されません。あなたのコードがなくても何が起こっているのか分かりませんが、最終的に必要なのは、主キーが設定されたCustomerオブジェクトです。次のコードを使用して、分離されたエンティティオブジェクトを削除できます。

this.ReportSchedDBContext.Entry(selectedCust).State = EntityState.Deleted; 
this.ReportSchedDBContext.SaveChanges(); 

あなたは別のタイプからキャストされ、それが問題を引き起こしている場合は、あなたも行うことができます:

var cust = new Customer { CustomerID = selectedCust.CustomerID }; 
this.ReportSchedDBContext.Entry(cust).State = EntityState.Deleted; 
this.ReportSchedDBContext.SaveChanges(); 
+0

こんにちはクリス、助けてくれてありがとう。私は古いバージョンのEF(v4)を使っていることを忘れてしまったので、あなたが投稿したもののほとんどが私には当てはまりません(例えばDBContext)。私は私のバージョンを更新しようとしましたが、多くのことが壊れてしまいました。今はこれに取り組む時間がありません。 – Overhed

0

私はViewですべての外部キーを使うべきだと思います。ビュー内のすべての外部キーと主キーを使用すると、カスケードとしてオブジェクトを更新および削除できます。

+0

返信いただきありがとうございますが、私は*ビューで何も削除しませんでした。実際に私はDelete Cascadeを無効にしましたが、私はまだ同じエラーを受けていました。私は基本的に何もしないストアドプロシージャを持つダミーDelete関数を定義し、ロジックを動作させるためにビューに削除をリンクしなければなりませんでした。 – Overhed

関連する問題