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:
- 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();
- 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.