2009-03-20 11 views
6

Tengo varias clases de entidad que utilizo para analizar archivos de texto de ancho fijo, así como el uso de Linq a SQL. Utilizo estas clases para analizar los datos de dichos archivos de texto y compararlos con los datos de la base de datos.La mejor manera de actualizar en Linq a SQL

Una de estas entidades tiene muchas propiedades, y no quiero perder tiempo configurando cada propiedad individual en el objeto de resultados Linq.

¿Hay alguna manera de decirle a Linq "Aquí está mi objeto, úsela para actualizar el registro"? Aquí está el código que estoy trabajando en:

 
if (partialContent.MonthlyAddChange == "A") 
    { 
     bookContentTable.InsertOnSubmit(partialContent); 
    } 
    else if (partialContent.MonthlyAddChange == "C") 
    { 
     var query = from bookContent in bookContentTable 
        where bookContent.EAN == partialContent.EAN 
        select bookContent; 

     if (query != null) 
     { 
      // Do something with query.First() 
     } 
    } 
} 

¿Es mejor para eliminar el registro y hacer un InsertOnSubmit() en este caso?

+3

La variable "consulta" nunca es nula, la secuencia puede estar vacía, pero no nula. –

Respuesta

2

creo que el concepto de editar un registro es diferente de borrar e insertar una nueva. Básicamente, creo que un ORM debe abstraer la generación de claves primarias y otras cosas relacionadas. Al eliminar e insertar, es posible que esté eliminando la integridad del registro (probablemente emitiendo una nueva clave principal, por lo que las entidades a las que se hace referencia no son válidas ...). Sugiero actualizar el registro siempre que la acción que está tomando es conceptualmente una actualización .

0

yo no borrar/recrear. Suponiendo que los dos objetos tienen la misma interfaz con respecto a las propiedades que desea actualizar, me gustaría utilizar la reflexión y copiar los valores del cambio en el objeto existente. Si alguno de los valores es diferente del original, el registro se marcará como necesario actualizar y SubmitChanges se encargará de ello.

Por ejemplo (con poca comprobación de errores):

foreach (var bookInfo in bookContent.GetType().GetProperties()) 
{ 
    var partialInfo = partialContent.GetType().GetProperty(bookInfo.Name); 
    if (partialInfo != null) 
    { 
     bookInfo.SetValue(partialInfo.GetValue(partialContent, null)); 
    } 
} 

Si sabía que eran del mismo tipo que podría volver a utilizar la primera PropertyInfo en vez de conseguir una nueva para partialContent.

1

estoy pensando que podría utilizar algo así como DataContext.Table.Attach (registro, verdadera) y luego DataContext.SubmitChanges(). Pero no lo tengo totalmente desarrollado ...

Así que ahora he hecho una prueba. Esto solo funcionará si no requiere la comprobación de concurrencia (es decir, usted es el único que actualiza la tabla).

Aquí está mi mesa

People 
PersonID int 
FirstName varchar(50) 
LastName varchar(50) 

que poblaron la mesa con el siguiente registro

> PersonID  FirstName LastName 
> 1   Jason  Punyon 

creé una LINQ2SQL DataContext con sólo esta tabla llamada PeopleDataContext y en cada propiedad de la clase La gente me puse la propiedad UpdateCheck de cada propiedad de registro en Never.

Aquí está el código:

static void Main(string[] args) 
{ 
    var p = new People(); 
    p.PersonID = 1; 
    p.FirstName = "Jason"; 
    p.LastName = "This is a new last name"; 


    using (var db = new PeopleDataContext()) 
    { 
     db.Peoples.Attach(p, true); 
     db.SubmitChanges(); 
    } 
} 

y funciona correctamente. Sin reflexión ni nada, pero como dije, pierdes la comprobación de concurrencia.

+0

¿Puede hacer que la propiedad de verificación de actualización cambie en letras grandes, ya que esa es básicamente la respuesta si no necesita preocuparse por la concurrencia –

1

¿Es mejor eliminar el registro y hacer un InsertOnSubmit() en este caso?

No, definitivamente no, solo tenga en cuenta la integridad referencial que debe usar cualquier diseño de BD bueno y estable. Si su registro ya está siendo utilizado por otras filas, no puede simplemente eliminarlo y volver a insertarlo; rompería esas restricciones de integridad.

Si solo está cambiando algunos valores, actualice la fila existente, mucho más fácil y mucho más consistente.

Marc

Cuestiones relacionadas