Обновить одну строку в таблице с помощью entity framework

#c# #webforms #entity-framework-6

#c# #веб-формы #entity-framework-6

Вопрос:

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

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

Ошибка 11 Не удается неявно преобразовать тип ‘System.Linq.IQueryable’ в ‘InventarioCiclico.xInventarioConfigs’. Существует явное преобразование (вам не хватает приведения?) C:UsersA0H79224DocumentsVisual Studio 2013ProjectsInventarioCiclicoInventarioCiclicoAccountAdminConfigurarInventario.aspx.cs 73 20 InventarioCiclico

  // The id parameter name should match the DataKeyNames value set on the control
    public void fvInventarioConfigs_UpdateItem(xInventarioConfigs configs)
    {

        InventarioCiclico.xInventarioConfigs item = configs;

        InventarioCiclicoContext context = new InventarioCiclicoContext();

        // Load the item here, e.g. item = MyDataLayer.Find(id);
        item = (from c in context.xInventarioConfigs select c).Take(1);
        if (item == null)
        {
            // The item wasn't found
            ModelState.AddModelError("", String.Format("Item with id was not found"));
            return;
        }

        TryUpdateModel(item);
        if (ModelState.IsValid)
        {
            context.SaveChanges();
            // Save changes here, e.g. MyDataLayer.SaveChanges();

        }
    }
  

Ответ №1:

Take возвращает IQueryable, даже если вы выбрали только одну запись с помощью Take(1). Вы можете использовать что-то вроде этого в качестве быстрого исправления:

 item = (from c in context.xInventarioConfigs select c).Take(1).FirstOrDefault();
  

Или даже без Take as FirstOrDefault все равно выбирает одну строку.

Ответ №2:

Take возвращает IQueryable, который может содержать только один элемент, но все равно является своего рода коллекцией. Если вы выбираете только одну запись с помощью Take (1), вы также можете выбрать First (будьте осторожны, если в вашем результирующем наборе их нет) или FirstOrDefault напрямую

 item = (from c in context.xInventarioConfigs select c).FirstOrDefault();