es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo crear un nuevo valor único en el contexto de la base de datos.

Tengo una tabla de la siguiente manera:

Eventos:

ID IDTarea Fecha y Hora

1 1 6 de diciembre de 2021, 10:15:21.086
2 1 6 de diciembre de 2021, 10:16:21.086
3 2 6 de diciembre de 2021, 11:15:21.086
4 1 7 de diciembre de 2021, 10:15:21.086
5 3 7 de diciembre de 2021, 10:17:21.086
6 3 8 de diciembre de 2021, 10:19:21.086

Básicamente, se están realizando tareas y quiero registrar eventos sobre estas tareas.

Para ello, he creado una tabla que agrega una nueva entrada cada vez que se registra un nuevo evento. El problema es que puedo tener múltiples eventos con la misma ID de Tarea, pero me gustaría poder decirle al DbContext “Toma el primer valor no utilizado disponible”.

¿Cómo puedo cambiar el ?? default(int) para en su lugar obtener el primer valor no utilizado? Así que si no le digo a qué tarea pertenece, simplemente crea una nueva tarea para ella.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener el primer valor no utilizado para TaskID, puedes modificar el método CreateWareHouseEvent de la siguiente manera:

    public bool CreateWareHouseEvent(CallContext callContext, int? TaskID, string Comment)
    {
        var warehouseEvent = new Domain.DataService.Contract.Model.WarehouseEvent();
        if (TaskID.HasValue)
        {
            warehouseEvent.TaskId = TaskID.Value;
        }
        else
        {
            var existingTaskIds = DbContext.Events.Select(e => e.IDTask).Distinct().ToList();
            for (int i = 1; i <= existingTaskIds.Count + 1; i++)
            {
                if (!existingTaskIds.Contains(i))
                {
                    warehouseEvent.TaskId = i;
                    break;
                }
            }
        }
        warehouseEvent.UserId = int.Parse(callContext.User);
        warehouseEvent.Comment = Comment;
        warehouseEvent.DateTask = DateTime.Now;
    
        DbContext.WarehouseEvents.Add(warehouseEvent)
        DbContext.SaveChanges();
    }
    

    Aquí, primero verificamos si se ha proporcionado un TaskID. Si se ha proporcionado, utilizamos ese valor tal cual. Sin embargo, si TaskID es nulo, recuperamos una lista de todos los TaskID existentes en la base de datos y luego recorremos todos los enteros desde 1 hasta el número de TaskID existentes + 1. Para cada entero, verificamos si existe en la lista de TaskID existentes y, si no existe, establecemos warehouseEvent.TaskId en ese valor y salimos del bucle. Esto nos dará el primer valor no utilizado para TaskID.

Comments are closed.