2010-06-10 18 views
7

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

+0

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. –

+0

Si modifico el nombre y otra propiedad, solo cambia la otra propiedad. –

Respuesta

12

Parece que su DBML puede estar fuera de sincronización. Debería eliminar las tablas y volver a agregarlas e intentar ejecutarlas de nuevo.

Simplemente borre su tabla Items manualmente y vuelva a agregarla.

EDIT: De acuerdo con su edición, debe consultar el siguiente hilo con respecto a GetHashCode.

http://social.msdn.microsoft.com/forums/en-US/linqtosql/thread/6cc6c226-f718-4b22-baad-dba709afe74b/

.Net rules claim that GetHashCode() and Equals() must always be implemented in tandem. Two objects that are equal must have the same hash code.

Also, the combination of GetHashCode() + Equals() forms the entity's concept of identity. If you make it based on field values (other than PK) then the identity changes as you change the fields. This is bad if L2S must lookup other info in a dictionary based on the entity's identity, and especially if L2S needs to find an entity in its identity cache!

Advice: don't change the identity of an entity. L2S expects it to be based on the object's natural (address based) identity.

+0

Acaba de eliminar la tabla manualmente y no funcionó. También traté de sincronizarlo con las herramientas de Hugati, y recibo el mismo error. –

+0

@Isaac ¿Funciona 'TestUpdateMPN' y solo' TestUpdateName' falla? Este error parece ocurrir cuando la definición de dbml de la tabla no coincide con el esquema. – Kelsey

+0

+1 para las cosas GetHashCode(). Ese resultó ser mi problema. Intentando cambiar un campo usado por GetHashCode() anulado. – tandrewnichols

0

Parece ser que el SQL que se genera no está incluyendo el contenido de la cláusula SET (aviso que no hay [Name] = @pXX después SET). ¿Están todas las propiedades (tipo de datos, tamaño, etc.) del campo de entidad establecidas correctamente en el diseñador de dbml?

+0

Presté atención a eso y edité la publicación hace un minuto. Las propiedades en el DBML parecen ser correctas. Uso Hugati DBML tools para mantener mi esquema DBML sincronizado con la base de datos. Gracias por la respuesta. –

+0

@Isaac: la última versión todavía refleja este problema (dice 'ACTUALIZACIÓN [dbo]. [Elementos] ESTABLECIDO DONDE ...'). L2S no está generando una lista de columnas para actualizar y los valores que las acompañan (esperaría que diga 'UPDATE [dbo]. [Items] SET [Name] = @ p0 WHERE ...' o algo similar). –

Cuestiones relacionadas