Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: 'operación de Base de datos se espera que afecte a 1 vuelta(s), pero en realidad afectó fila 2(s)

0

Pregunta

He recibido este error cuando intento actualizar la tabla con el mismo valor (carNumber), mi estado es para actualizar los cuales la fecha de devolución del campo es nulo.

Por alguna razón está de parecerse a la consulta de retorno de 2 filas, pero en realidad sólo hay uno. Estoy usando EF. Esta es la función:

el error de impresión de la pantalla

   public void updateStatus(int carNumber1, string acctualDate1)
    {
        DateTime accReturn = DateTime.Parse(acctualDate1);

        var orderCar1 =  db.CarRentalFields.FirstOrDefault(carNum =>
        (carNum.CarNumber == carNumber1 && carNum.ActualReturnDate == null));

            orderCar1.ActualReturnDate = accReturn  ;
             
                db.SaveChanges();

El error de elevar al intentar db.saveChanges()

la tabla de la db, el número del coche es de 1000 - impresión de la pantalla

modelBuilder.Entidad pic

por favor, hágamelo saber cómo puedo solucionar este problema.

c# entity-framework linq sql-server
2021-11-23 20:34:34
2
0

problema resuelto por agregar una nueva columna a la car_rental_fields tabla, columna de id que incluyen la Identidad. como yo lo entiendo desde aquí y desde la web, hay un problema con el complicado pk. en mi solución el id no es una clave principal, pero se trata de hacer la lógica de linq para actualizar la columna correcta. gracias " por todas las personas que intervienen en este problema.

2021-11-26 20:37:27
0

Este error se produce cuando la EF no puede resolver el PK de la entidad. En la mayoría de los casos por simple entidades, EF convenciones puede trabajar el PK, pero en el caso de que usted está utilizando una clave compuesta por lo que este necesita ser configurado. Dependiendo de cómo se asignan las entidades usted puede hacer esto ya sea en:

  • un EDMX
  • en el DbContext.OnModelCreating
  • el uso de un EntityTypeConfiguration declaración
  • el uso de los atributos dentro de la misma entidad

Ya no sabemos cómo las entidades están configurados, se puede comprobar como la causa mediante el atributo enfoque dentro de su entidad como una prueba. Si usted está usando un EDMX las clases de entidad se generará por lo que se desea reemplazar esta configuración, dentro de la EDMX. (No se puede realmente ayudar porque yo no uso el dang cosas :D )

Usted probablemente va a tener algo como:

public class CarRentalFields
{
    [Column("start_day")]
    public DateTime StartDay { get; set; }
    [Column("return_date")]
    public DateTime ReturnDate { get; set; }
    [Column("user_id")]
    public int UserId { get; set; }
    [Column("car_number")]
    public DateTime CarNumber { get; set; }
    
    // ... more columns...
}

Usted puede incluso tener un [Key] atributo en uno de estos campos, tales como CarNumber. Si hay un PK asignadas en la entidad el problema es que no es lo suficientemente específico para identificar la fila. Cuando EF va a actualizar una entidad, es la comprobación de, y la espera de la actualización de sólo una fila en la tabla. Se trata de encontrar más de una fila se verán afectadas por lo que no puede.

Anexar los atributos de la [Key] con el orden de las columnas para que se reconozca como una clave compuesta.

public class CarRentalFields
{
    [Key, Column(Name="start_day", Order=1)]
    public DateTime StartDay { get; set; }
    [Key, Column(Name="return_date", Order=2)]
    public DateTime ReturnDate { get; set; }
    [Key, Column(Name="user_id", Order=3)]
    public int UserId { get; set; }
    [Key, Column(Name="car_number", Order=4)]
    public DateTime CarNumber { get; set; }
    
    // ... more columns...
}

Siempre estas 4 columnas están garantizados para ser de una única restricción sobre la mesa, EF estará satisfecho cuando sólo una fila se actualiza cuando se construye la ACTUALIZACIÓN de la instrucción SQL.

Observe de nuevo que si funciona esto y usted está usando un EDMX, será necesario revisar y modificar su EDMX de asignación para realizar los cambios apropiados, ya que la clase de entidad podría ser regenerado, la pérdida de sus atributos extra. (Creo que las clases de entidad generadas a partir de un EDMX tiene un comentario advertencia de cabecera que es una clase que se genera, por lo que es un indicador a tener en cuenta.)

Actualización: Mi principal sospechoso de esto sería que la mesa, en realidad, no tienen una correspondencia PK definido, ya sea ejecutando diferentes PK combinación, o más probable es que no sea PK dada la naturaleza de los campos. EF puede operado en las tablas que no tienen PK definido, pero sí que requiere de una definición de Clave que asegura que los registros puedan ser identificados. El error que estamos viendo que sucede cuando esa clave definición no es suficientemente especial. (I. e. si está actualizando coche 1, y la selección de una fila que tiene: car_number = 1, start_day = 2021-11-21, return_day = 2021-11-22, user_id = 0, El problema es que más de una fila tiene esa combinación en la DB. Si la BBDD está comprobando no tiene más de una fila coincidente, a continuación, su aplicación es casi seguro que apunta a una base de datos diferente de lo que usted va a comprobar.

Cosas que usted puede hacer para comprobar esto:

  1. obtener el tiempo de ejecución de la cadena de conexión y ver si coincide con el DB está comprobando:

Antes de ejecutar la consulta, agregue la siguiente:

// EF6
var connectionString = db.Database.Connection.ConnectionString;
// EF Core 5
var connectionString = db.Database.GetConnectionString();
  1. Eche un vistazo a los datos que son en realidad la consulta:

.

var cars =  db.CarRentalFields.Where(carNum =>
    (carNum.CarNumber == carNumber1 && carNum.ActualReturnDate == null)).ToList();

Mientras que esta consulta puede devolver sólo 1 registro, que no es la causa del problema. Lo que quiero es que el CarNumber, Fechainicio, ReturnDate, y el id de usuario de este registro:

var car =  db.CarRentalFields
    .Where(carNum => carNum.CarNumber == carNumber1 
        && carNum.ActualReturnDate == null)
    .Select(x => new 
    {
        x.CarNumber,
        x.StartDay,
        x.ReturnDate,
        x.UserId
    }).Single(); // Expect our 1 record here...
var cars = db.CarRentalFields
    .Where(x => x.CarNumber == car.CarNumber
        && x.StartDay == car.StartDay
        && x.ReturnDate == car.ReturnDate
        && x.UserId == car.UserId)
    .ToList(); // Get rows that match our returned Key fields.

Estas consultas seleccione la supuesta valores de PK para coche registro te refieres a la actualización, a continuación, buscar coches de registros coincidentes con la espera de los campos Clave. Mi dinero estaría en que mientras que la parte superior de la consulta devuelve 1 registro, la parte inferior de la consulta devuelve dos filas, significado, mientras que sólo 1 registro tiene un #null ActualReturnDate valor, la Clave no es el único suficiente para que el contenido de esta tabla.

2021-11-26 22:57:48

estoy usando contex, ¿tú has visto mi pantalla de impresión del modelo del generador?
elirans

Sí, aceptar que el uso de la DbContext del OnModelCreating modelBuilder, por lo que la Clave está definido. La siguiente cosa a comprobar es si esas columnas coincide con el PK /w única restricción en su base de datos correspondiente. Si no, que la clave puede necesitar ser ampliado. Claves compuestas deben evitarse tanto como sea posible, ya que hacen el establecimiento de relaciones mucho más trabajo. También puede utilizar un analizador para la captura de la propuesta de actualización de la declaración, luego convertirlo en un simple SELECT para ver qué se devuelven filas. Por alguna razón, más de uno filas están volviendo.
Steve Py

Otra cosa a comprobar es si en tiempo de ejecución de la aplicación consiste en golpear la misma base de datos como lo está comprobando. Los datos que se están comprobando podría aparecer suficientemente especial si la DB no es la de imponer una restricción unique en esas columnas, pero la base de datos que se señala en el tiempo de ejecución ha filas duplicadas.
Steve Py

el mismo error se producen utilizando su solución, ¿tengo que cambiar mi función también? @Steve Py
elirans

Captura el SQL se genera y se ejecutan en la base de datos. Yo normalmente uso un Perfilador para esto, así que para SQL Server y SSMS, en Herramientas\Analizador de SQL. De ejecución que contra su DB, a continuación, ejecute la consulta. Usted puede utilizar un punto de interrupción en la aplicación justo antes de la SaveChanges, a continuación, desactive el analizador de salida antes de volver a limpiar anterior de ruido y encontrar la instrucción UPDATE.
Steve Py

También, usted puede publicar el diseñador de tablas de salida para la tabla? ¿La tabla de tener un PK conjunto con los 4 columnas?
Steve Py

He añadido a la respuesta de arriba para incluir pasos para comprobar la conexión de la cadena, así como comprobar en los datos si existen valores de clave duplicados.
Steve Py

He intentado la solución. lo primero que se vea como se olvida de algunos '=' en los coches var. segunda cosa - cuando trato de hacer la actualización: los coches.ActualReturnDate = acctualDate1; tengo un error cs1061.
elirans

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................