Tengo algunos problemas con la actualización de linq a las entidades sql. Por alguna razón, puedo actualizar cada campo de mi entidad item
además de nombre.Linq a SQL - Error al actualizar
Aquí hay dos pruebas sencillas que escribí:
[TestMethod]
public void TestUpdateName() {
using (var context = new SimoneDataContext()) {
Item item = context.Items.First();
if (item != null) {
item.Name = "My New Name";
context.SubmitChanges();
}
}
}
[TestMethod]
public void TestUpdateMPN() {
using (var context = new SimoneDataContext()) {
Item item = context.Items.First();
if (item != null) {
item.MPN = "My New MPN";
context.SubmitChanges();
}
}
}
Desafortunadamente, TestUpdateName() falla con el siguiente error: System.Data.SqlClient.SqlException: Incorrect syntax near the keyword 'WHERE'..
Y es el SQL emitida aquí:
UPDATE [dbo].[Items] SET WHERE ([Id] = @p0) AND ([CategoryId] = @p1) AND ([MPN] = @p2) AND ([Height] = @p3) AND ([Width] = @p4) AND ([Weight] = @p5) AND ([Length] = @p6) AND ([AdministrativeCost] = @p7) -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- @p2: Input VarChar (Size = 10; Prec = 0; Scale = 0) [My New MPN] -- @p3: Input Decimal (Size = 0; Prec = 5; Scale = 3) [30.000] -- @p4: Input Decimal (Size = 0; Prec = 5; Scale = 3) [10.000] -- @p5: Input Decimal (Size = 0; Prec = 5; Scale = 3) [40.000] -- @p6: Input Decimal (Size = 0; Prec = 5; Scale = 3) [30.000] -- @p7: Input Money (Size = 0; Prec = 19; Scale = 4) [350.0000] -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926
Como usted puede ver, no se está generando ninguna actualización (SET está vacío ...) No tengo idea de por qué sucede esto.
Y ya con antelación ... SÍ, la tabla Item
tiene una PK (Id). ¡Gracias de antemano!
Actualización: Parece que el error se debe a la anulación de GetHashcode(). Esta es mi implementación actual:
return string.Format("{0}|{1}|{2}|{3}", Name, Id, UPC, AdministrativeCost).GetHashCode();
lo que sucede si se modifica Nombre y otra propiedad? ¿Actualiza ambas o solo la otra propiedad? También en el código generado está el colocador en Nombre disparando el evento 'PropertyChanged'? No creo que DataContext lo considere un cambio a menos que se dispare el evento. –
Si modifico el nombre y otra propiedad, solo cambia la otra propiedad. –