Невозможно обновить EntitySet '<entity>', потому что у него есть DefiningQuery - PullRequest
0 голосов
/ 04 июня 2019

Я столкнулся со странной проблемой, которой у меня никогда не было прежде.

У меня есть это действие в контроллере в приложении MVC:

    //
    // GET: /Servicio/FijoInventario/Almacena
    async public Task<ContentResult> Almacena()
    {
        try
        {
            CheckSignature();

            string data = Request.Form.ToString();
            if (String.IsNullOrEmpty(data))
                return Content("FAIL");

            DateTime fecha = DateTime.Now;

            // Campos -> "Correlativo;Auditor;Dirección;Empresa;Tipo;EPC;NroSerie;Marca;Modelo;En Uso;RUT Usuario;Nombre Usuario;Fecha;Hora";
            var inventarios = Server.UrlDecode(data).Split('\n');

            var auditor = new Helpers.Auditor(DB);
            var direccion = new Helpers.Direccion(DB);
            var tipo = new Helpers.Tipo(DB);
            int index = 0;
            foreach (var inventario in inventarios)
            {
                var cells = inventario.Trim().Split(';');
                if (cells.Length != 16 || index++ == 0)  // index = 0 => encabezado
                    continue;

                string epc = cells[5].Trim();

                DateTime fechaHora = DateTime.MinValue;

                if (!DateTime.TryParseExact(String.Concat(cells[12].Trim(), " ", cells[13].Trim()), "dd-MM-yyyy HH:mm", System.Globalization.CultureInfo.CurrentUICulture, System.Globalization.DateTimeStyles.None, out fechaHora))
                    DateTime.TryParseExact(String.Concat(cells[12].Trim(), " ", cells[13].Trim()), "dd/MM/yyyy HH:mm", System.Globalization.CultureInfo.CurrentUICulture, System.Globalization.DateTimeStyles.None, out fechaHora);

                Models.Direccion oDireccion = direccion.ObtieneDireccionByNombre(cells[2].Trim());

                bool enrolado = cells[14].Trim().Equals("Sí");
                bool inventariado = cells[15].Trim().Equals("Sí");

                Models.FijoInventario inv = DB.FijoInventario.Where(i => i.InventarioEPC == epc && i.DireccionId == oDireccion.DireccionId && i.InventarioEnrolado == enrolado && i.InventarioInventariado == inventariado).FirstOrDefault();

                if (inv == null)
                {
                    inv = new Models.FijoInventario();
                    inv.InventarioFechaCreacion = fecha;

                    DB.FijoInventario.Add(inv);
                }
                else
                    inv.InventarioFechaModificacion = fecha;

                inv.Auditor = auditor.ObtieneAuditorByNombre(cells[1].Trim());
                inv.Direccion = oDireccion;
                inv.Tipo = cells[4].Trim() == String.Empty ? null : tipo.ObtieneTipoByNombre(cells[4].Trim());
                inv.InventarioEPC = epc;
                inv.InventarioNumeroSerie = cells[6].Trim();
                inv.InventarioMarca = cells[7].Trim();
                inv.InventarioModelo = cells[8].Trim();
                inv.InventarioEnUso = cells[9].Trim().Equals("Sí");
                inv.InventarioRutUsuario = GetModifiedSignal(cells[10].Trim(), false);
                inv.InventarioNombreUsuario = cells[11].Trim();
                inv.InventarioFecha = fechaHora.Date;
                inv.InventarioHora = fechaHora;
                inv.InventarioEnrolado = enrolado;
                inv.InventarioInventariado = inventariado;

                var importacion = new Models.FijoImportacion
                {
                    ExportacionEPC = epc,
                    ExportacionFechaInventario = fechaHora,
                    ExportacionFechaCreacion = DateTime.Now,
                    ExportacionLinea = inventario.Trim()
                };
                DB.FijoImportacion.Add(importacion);
            }

            await DB.SaveChangesAsync();

            return Content("OK");
        }
        catch (Exception ex)
        {
            Helpers.ErrorLog.Save(ex);
            throw ex;
        }
    }

Этот код просто получает файл CSV поверхИнтернет и сохраняет каждую строку в виде записей в таблице SQL Server.

Это прекрасно работало до 15 дней назад.Я только что понял, что в действии Almacena с этой даты генерируется исключение:

Unable to update the EntitySet 'FijoImportacion' because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element to support the current operation.
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Dashboard.Areas.Servicio.Controllers.FijoInventarioController.<Almacena>d__1.MoveNext()

При поиске в Интернете ни одно решение не работает для меня.Это только 1 таблица с определенным первичным ключом.

Основная таблица имеет 3 взаимосвязи: Auditor, Direccion, Tipo.Во всех таблицах определен первичный ключ.

На всякий случай я заново сгенерировал файл EDMX, но произошла та же ошибка.

Что здесь может произойти?

С уважением

Хайме

...