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.

El guardado de cambios asincrónico falla con usuarios asignados al objeto AspNetUsers debido a una violación de clave duplicada.

Estoy tratando de crear un elemento Proyecto donde un proyecto puede tener varios usuarios. Asigna el usuario escribiendo su nombre y presionando el botón; el controlador buscará al usuario y devolverá al usuario si existe. Luego se agregan a la Lista que se asigna al proyecto en la presentación de creación del proyecto. Cuando se activa el POST para el proyecto, SaveChangesAsync () produce una respuesta http 500 con el error:
Microsoft.EntityFrameworkCore.DbUpdateException: Se produjo un error al actualizar las entradas. Consulte la excepción interna para obtener detalles.
—> Microsoft.Data.SqlClient.SqlException (0x80131904): Violación de la restricción PRIMARY KEY ‘PK_AspNetUsers’. No se puede insertar una clave duplicada en el objeto ‘dbo.AspNetUsers’. El valor de clave duplicado es (fa2f3cdf-6147-4973-9c1e-988a21408610).
La declaración ha sido terminada.

No puedo entender por qué podría estar sucediendo esto, siento que el formulario se está enviando dos veces o el Editform se está enviando incorrectamente a través de los dos botones. Soy muy nuevo en Blazor y EF, así que agradecería cualquier idea sobre lo que podría estar causando esto y cómo podría resolver este problema. Gracias de antemano

Crear página razor

<EditForm Model=" @projectItem" OnValidSubmit=" @CreateNewProject">

<DataAnnotationsValidator />

<div class="form-group">
    <label class="custom-control-label"> Nombre </label>
    <InputText id="title" @bind-Value="projectItem.ProjectName" class="form-control" />
    <InputText id="title" @bind-Value="projectItem.ProjectDescription" class="form-control" />
    <ValidationMessage For="@(() => projectItem.ProjectName)" />

    <button type="submit" class="btn btn-primary">Crear proyecto</button>

</div>

<ValidationSummary />
</EditForm>

<EditForm Model=" @AssignUser" OnValidSubmit=" @AddUserToProject">

<DataAnnotationsValidator />
<div class="form-group">
    <label class="custom-control-label"> Asigne usuarios </label>
    <InputText id="title" type="email" @bind-Value="@AssignUser.UserName" class="form-control" />

    <button type="submit" class="btn btn-primary">Agregar usuario</button>
</div>
</EditForm>

 Usuarios asignados actualmente 

@if (ListOfAllUsers.Count() == 0)
{
     Todavía no se han asignado usuarios. 
}
else
{
    @for(int i = 0; i < ListOfAllUsers.Count(); i++)
    {
        <li> @ListOfAllUsers[i].UserName </li>
    }
}

private Proyecto proyectoItem { get; set; } = new Proyecto();
private ApplicationUser AssignUser { get; set; } = new ApplicationUser();
private List<ApplicationUser> ListOfAllUsers { get; set; } = new List<ApplicationUser>();

// envío y creación de proyecto con los usuarios asignados
private async void CreateNewProject()
{
    projectItem.AssignedUsersToProject = ListOfAllUsers;

    try
    {
        var response = await Http.PostAsJsonAsync("Projects", projectItem);
        var content = await response.Content.ReadAsStringAsync();
        var project = JsonConvert.DeserializeObject<Proyecto>(content);

        if(response.IsSuccessStatusCode)
            Navigation.NavigateTo($"/projects");

    }
    catch (Exception e)
    {

    }
}

// buscar y agregar usuario
private async void AddUserToProject()
{

    try
    {
        var response = await Http.PostAsJsonAsync($"Projects/{AssignUser.UserName}", AssignUser);
        var content = await response.Content.ReadAsStringAsync();
        var userobject = JsonConvert.DeserializeObject<ApplicationUser>(content);

        if (response.IsSuccessStatusCode)
        {
            if (!ListOfAllUsers.Any(n => n.UserName.Equals(userobject.UserName)))
            {
                ListOfAllUsers.Add(userobject);
            } else
                {
                    AssignUser.UserName = "Este usuario ya se agregó al proyecto.";
                }
        } else if (!response.IsSuccessStatusCode)
            {
                AssignUser.UserName = "Usuario no encontrado. Inténtelo de nuevo.";
            }
    }
    catch (Exception e)
    {

    }
}

Controlador: Crear proyecto

[HttpPost]
public async Task<ActionResult> PostProject(Proyecto project)
{

    _context.Projectos.Add(project);
    await _context.SaveChangesAsync(); // se produce un error cuando se alcanza este punto
    return CreatedAtAction("GetProject", new { id = project.ProjectId}, project);

}

Controlador: buscar y devolver usuario

[HttpPost(“{userEmail}”)]
public async Task<ActionResult> AddUserToProject(string userEmail)
{
try
{
// Hallar usuario
ApplicationUser userValid = _userManager.Users.Where
(s => s.Email == userEmail).First();

        return userValid;
    }
    catch (InvalidOperationException)
    {
        return BadRequest();
    }
}

Modelos

public class Proyecto
{
[Key]
public Guid ProjectoId { get; set; }

[Required]
public string ProjectName { get; set; } 

[JsonIgnore]
public ICollection<ApplicationUser> AssignedUsersToProject { get; set; }

public Company assignedCompanyForProject { get; set; }

}

public class ApplicationUser : IdentityUser
{
public string nombre { get; set; }

public string apellido { get; set; }

[JsonIgnore]
public ICollection<Proyecto> Projectos { get; set; }

}

Imagen del formulario

Ingrese el nombre del usuario que desea agregar al proyecto y haga clic en “Agregar usuario”, que encontrará y devolverá al usuario si es un usuario que existe (esto no crea el proyecto, solo encuentra al usuario). Luego, se agrega a la lista del ListOfAllUsers , que luego se recorre en bucle para mostrar todos los usuarios actuales asignados. Una vez que se otorga un título y descripción del proyecto junto con los usuarios relevantes, se debe presionar el botón “Crear proyecto”, que creará todo el proyecto con los usuarios asignados que se hayan determinado. Esto es lo que se envía a la base de datos para agregar un nuevo elemento de Proyecto.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece ser que el error es causado por un intento de insertar datos duplicados en la base de datos, específicamente, tratando de insertar un usuario con una clave primaria que ya existe. Esto sugiere que el usuario está siendo agregado a la base de datos dos veces, lo que podría ser causado por el formulario enviándose dos veces o por el EditForm siendo enviado a través de dos botones.

    Una posible solución podría ser agregar una verificación antes de agregar al usuario para asegurar que no esté ya en la lista. Otra solución podría ser implementar EntityState.Unchanged para asegurarse de que los usuarios no se estén duplicando en la base de datos.

    Para implementar EntityState.Unchanged, se puede recorrer la colección de AssignedUsersToProject y establecer su estado de entidad a EntityState.Unchanged antes de agregar el proyecto al contexto:

    foreach(var x in project.AssignedUsersToProject)
    {
        _context.Entry(x).State = EntityState.Unchanged;
    }
    _context.Projects.Add(project);
    await _context.SaveChangesAsync();
    

    Sin embargo, si esto todavía produce un error, puede ser necesario buscar otras causas del problema, como problemas con los datos que se pasan o con la configuración de la base de datos. También podría ser útil agregar manejo de errores y registro para obtener más información sobre el error.

Comments are closed.