2010-07-21 6 views

Respuesta

8

Sí se puede:

Foo foo=new Foo { FooId=fooId }; // create obj and set keys 
context.Foos.Attach(foo); 
foo.Name="test"; 
context.SubmitChanges(); 

En su DBML establece UpdateCheck = "Nunca" para todas las propiedades.

Esto generará una única declaración de actualización sin seleccionar.

Una advertencia: si quieres ser capaz de establecer Nombre en nulo que tendría para inicializar el objeto foo a un valor diferente por lo LINQ puede detectar el cambio:

Foo foo=new Foo { FooId=fooId, Name="###" }; 
... 
foo.Name=null; 

Si desea comprobar si hay una marca de tiempo durante la actualización también puede hacer esto:

Foo foo=new Foo { FooId=fooId, Modified=... }; 
// Modified needs to be set to UpdateCheck="Always" in the dbml 
+0

Suena interesante. ¡Lo probaré en unos días! –

+1

Ah sí, un enfoque similar funciona en EF. Aunque tengo que generar la propiedad EntityKey así como el valor para la propiedad de la clave principal. –

1

Siempre se puede crear una instrucción T-SQL estándar y ejecutar que en contra de su almacén de datos:

YourDataContext 
    .ExecuteCommand("UPDATE dbo.YourTable SET ThatField = newValue WHERE ID = 777", null); 

Con LINQ to SQL en sí, no se puede hacer esto - es básica suposición es que siempre funciona en el objeto, el objeto completo, y nada más que el objeto.

Si necesita hacer esto regularmente, una manera sería envolverlo en un proceso almacenado y agregar ese proceso almacenado a su contexto de datos como un método que puede invocar en el contexto de datos.

+0

OMG, es una pena. ¿Ha cambiado la situación en EF? ¿Confiaría personalmente en los operadores de T-SQL incorporados o en los Procedimientos almacenados incrustados en el Modelo para tales casos? –

+0

No - EF tiene el mismo enfoque, pero también lo hace NHibernate o cualquiera de los otros OR cartógrafos. Están diseñados para cargar, manipular y guardar ** objetos ** como un todo. No conozco ningún ORM que le permita recuperar solo uno o dos campos, cambiarlos y guardarlos .... –

+0

en EF podemos crear una entidad en memoria, iniciar la propiedad EntityKey + propiedad de la clave principal, luego adjuntar, luego cambiar las propiedades que queremos actualizar SaveChanges funciona para las actualizaciones. –

1

Puede actualizar el objeto. En este ejemplo se va a cambiar nombre de la persona:

Person person = _entities.Persons.FirstOrDefault(p => p.Id == id); 
person.FirstName = "Bill"; 
_entities.Refresh(System.Data.Objects.RefreshMode.ClientWins, person); 
_entities.SaveChanges(); 
+1

Gracias, @Gnome. ¿Pero es posible actualizar el campo sin recuperación de entidad? –

+0

;-) Estaba volviendo a leer tu publicación. Por lo que sé, necesitarás la entidad. Pero esta solución evita esa vieja escuela-sql. – gnome

+1

sí, evita el SQL de "la vieja escuela", pero primero tendrá que recuperar la entidad completa y volverá a guardar la entidad completa. El SQL de la "vieja escuela" puede evitar eso muy fácilmente ... –