sql - una - Solución para: La actualización de la tienda, la inserción o la eliminación afectaron a un número inesperado de filas(0)
insertar datos en una tabla sql server (9)
Encontré una solución para las personas que reciben una excepción:
La actualización, inserción o eliminación de la tienda afectó a un número inesperado de filas (0). Las entidades pueden haber sido modificadas o eliminadas desde que se cargaron las entidades. Actualice las entradas de ObjectStateManager.
Pero, de todos modos, tengo una pregunta.
Leí el tema: Entidad Marco: "La actualización, inserción o eliminación de la tienda afectó a un número inesperado de filas (0)". Para VMAtm, Robert Harvey
En mi caso, tuve, por ejemplo, artículos de mesa:
Articles
------------
article_id
title
date_cr
date_mod
deleted
Y tuve gatillo:
create trigger articles_instead_of_insert
on articles instead of insert
as
SET NOCOUNT ON;
insert into articles(
article_id,
title,
date_cr,
date_mod,
deleted
)
select
user_id,
title,
isnull(date_cr, {fn NOW()}),
isnull(date_mod, {fn NOW()}),
isnull(deleted, 0)
from inserted;
go
Cuando elimino este disparador, no obtengo esta excepción. Entonces este gatillo es un problema. Y ahora tengo una pregunta: ¿por qué? ¿Debo hacer algo?
Encontré este error cuando actualizo la entidad y olvidé pasar el valor de la clave primaria ....
Entonces, la entidad puede actualizar el registro con referencia con la clave primaria
Solución: verifique si el valor de la clave primaria es aprobado o no para actualizar el registro dado. :)
Es mejor que actualice su método de guardado de esta manera ..... En caso de que llame savechange()
método savechange()
del contexto de la entidad después de cada addobject y deleteobject o modificación:
public void Save(object entity)
{
using (var transaction = Connection.BeginTransaction())
{
try
{
SaveChanges();
transaction.Commit();
}
catch (OptimisticConcurrencyException)
{
if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Deleted || ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Modified)
this.Refresh(RefreshMode.StoreWins, entity);
else if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Added)
Detach(entity);
AcceptAllChanges();
transaction.Commit();
}
}
}
Es porque tienes SET NOCOUNT ON
.
La declaración EF SQL que genera SIEMPRE agrega una cláusula de where @@ROWCOUNT > 0 and [ID] = scope_identity()
(por ejemplo).
Observe la cláusula where @@ROWCOUNT > 0
. Quítese su declaración SET NOCOUNT ON
y debería funcionar.
Posible problema: colocaste ReadOnlyAttribute en los metadatos de tu clave de entidad, lo que hace que su valor se vuelva cero
[DisplayName("Student ID")]
[ReadOnly(true)]
public int StudentID { get; set; }
Solución: elimine ReadOnlyAttribute
[DisplayName("Student ID")]
public int StudentID { get; set; }
Primero se usa el código de Entity Framework,
usando (MyDbContext db = new MyDbContext ()) {..
Agregando esto después de la línea que usa:
db.Configuration.ValidateOnSaveEnabled = true;
Solución:
try {
context.SaveChanges();
} catch (OptimisticConcurrencyException) {
context.Refresh(RefreshMode.ClientWins, db.Articles);
context.SaveChanges();
}
Tenía InsertAsync configurando EntityState a Modified implementando un patrón Repository . Cuando depuré vi que la identificación de la entidad era 0
public async Task InsertAsync(T entity)
{
dbContext.Entry(entity).State = EntityState.Modified;
await dbContext.SaveChangesAsync();
}
Cambiar el estado de la entidad a Agregado lo solucionó.
dbContext.Entry(entity).State = EntityState.Added;
Tuve el mismo error, entonces me di cuenta de que olvidé la clave primaria establecida en la tabla y establecí los valores de incremento ...
Tuve el mismo problema, este mensaje de error es bastante desconcertante. La respuesta de webtrifusion me ayudó. Consulte Entity Framework: "La actualización de la tienda, la inserción o la eliminación afectaron a un número inesperado de filas (0)".
Resulta que olvidé agregar "Id: 0" en el JSON en el lado del cliente.