2016-04-22 2 views
8

У меня есть модель объекта First Model, которая содержит таблицу Customer, связанную с представлением, которое извлекает данные о клиентах из отдельной базы данных. Взаимосвязь между таблицей «Клиент» и «Просмотр» является «Один для многих», и у меня есть свойство навигации как для объекта Customer, так и для объекта View.Удаление объекта сущности с 1 до многих ассоциаций для объекта на основе представления

При попытке выполнить удаление с помощью context.Customers.DeleteObject (ПАМ) и вызовите context.SaveChanges() Я получаю сообщение об ошибке:

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


Я попытался установить на Delete каскада и Нет и оба генерируют одну и ту же ошибку.

EDIT: Там не много кода, чтобы показать, но здесь вы идете:

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

показать нам ваш код bro –

+1

Есть ли у вашего лица и таблицы первичный ключ? – Overmachine

+0

Сущность, основанная на реальной таблице (Customer), делает объект, основанный на представлении, не так как он основан на представлении. – Overhed

ответ

1

я смог обойти эту проблему путем создания фиктивной хранимой процедуры, которая не делает ничего («SELECT« Done ») и с помощью сопоставления функций SP в моих двух представлениях установите функцию Delete в эту хранимую процедуру. Достаточно взломать, но это сработало.

Я не уверен, почему для представления требуется функция удаления, или если я делаю что-то еще неправильно, что вызвало проблему, но это работало для меня.

1

Многие соответствующие должности в SO согласны с @Overmachine ... вы, вероятно, отсутствуют первичный ключ на лицо/таблицу.

См ..

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 стол с первичным ключом, но ваш вид нет. Не уверен, что происходит без вашего кода, но в конечном итоге все, что вам нужно, это объект 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

Я думаю, вы должны использовать все внешние ключи в представлении. когда вы используете все внешние ключи и первичные ключи, вы можете обновлять и удалять объект как каскад.

+0

Спасибо за ваш ответ, но я не * хочу * удалять что-либо в представлении. Фактически я отключил Delete Cascade, и я все еще получал ту же ошибку. Мне пришлось в основном определить фиктивную функцию Delete со хранимой процедурой, которая ничего не делает и связывает удаление с представлением для работы логики. – Overhed

Смежные вопросы