Подтвердить что ты не робот

Почему при попытке обновить модель в Entity Framework возникает ошибка "Не удалось обновить EntitySet, потому что она имеет DefiningQuery..."?

При обновлении с помощью LINQ to SQL с использованием Entity Framework генерируется исключение.

System.Data.UpdateException: Unable to update the EntitySet 't_emp' because it has 
a DefiningQuery and no <UpdateFunction> element exists in the   
<ModificationFunctionMapping>

Код для обновления:

public void Updateall()
    {
        try
        {


            var tb = (from p in _te.t_emp
                      where p.id == "1"
                      select p).FirstOrDefault();
            tb.ename = "jack";

            _te.ApplyPropertyChanges(tb.EntityKey.EntitySetName, tb);
            _te.SaveChanges(true);
        }
        catch(Exception e)
        {

        }
    }

Почему я получаю эту ошибку?

4b9b3361

Ответ 1

Проблема была в структуре таблицы. Чтобы избежать ошибки, мы должны сделать один первичный ключ в таблице. После этого обновите edmx. Проблема будет исправлена.

Ответ 2

Три вещи:

  • Не перехватывайте исключения, с которыми вы не можете справиться. Вы ловите все возможные исключения, а затем ничего не делаете (кроме проглатывания). Это плохая вещь и торговля; Вы действительно хотите тихо делать ничего, если что-то пойдет не так? Это приводит к поврежденному состоянию, которое трудно отлаживать. Нехорошо.

  • Linq to SQL - это ORM, как и Entity Framework. Возможно, вы используете LINQ для обновления объектов, но вы не используете Linq для SQL, вы используете Entity Framework (Linq to Entities).

  • Вы пробовали решение изложенное здесь? Исключение, которое вы опубликовали, несколько обрезано, поэтому я не могу быть уверенным, что он точно такой же (пожалуйста, обновите свой пост, если это не так), и если это то же самое, можете ли вы прокомментировать, работает ли следующее для вы?

"[..] Entity Framework не знает, обновляется ли данное представление или нет, поэтому он добавляет элемент <DefiningQuery> для защиты против попытки создания запросов к невосстанавливаемое представление.

Если ваше представление обновляется, вы можете просто удалить <DefiningQuery>элемент из определения EntitySet для вашего представления внутри StorageModel раздела .edmx и обычной обработки обновлений будет работать как с любой другой таблицей.

Если ваше представление не обновляется, вам необходимо предоставить обновление логику себя через" Отображение функции модификации ". Функция Modification Mapping вызывает функцию, определенную в Раздел StorageModel вашего .edmx. Эта функция может содержать имя и аргументы в хранимую процедуру в вашей базе данных, или вы можете используйте" команду определения ", чтобы написать вставку, обновление или delete непосредственно в определении функции внутри StorageModel вашего .edmx." (Emphasis mine, post formatted для ясности и для)

(Источник: "Майк" на MSDN)

Ответ 3

Но вы можете установить первичный ключ в модели, если используете MVC Asp.net

Просто откройте model.edmx в вашей таблице, перейдите к свойству поля и установите Entity Key = True