visual studio online net mvc conexion asp .net visual-studio-2008 linq linq-to-sql

.net - studio - La mejor forma de actualizar en Linq a SQL



linq to sql visual studio 2017 (5)

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.

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

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

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 eliminar el registro y hacer un InsertOnSubmit () en este caso?


Creo que el concepto de editar un registro es diferente de eliminar e insertar uno nuevo. 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 que actualice el registro cada vez que la acción que está tomando sea conceptualmente una actualización .


Estoy pensando que podrías usar algo como DataContext.Table.Attach (record, true) y luego DataContext.SubmitChanges (). Pero no lo tengo totalmente desarrollado ...

Entonces ahora hice 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)

He llenado la tabla con el siguiente registro

> PersonID FirstName LastName > 1 Jason Punyon

Creé un DataContext LINQ2SQL con solo esta tabla llamada PeopleDataContext y en cada propiedad de People Class establecí la propiedad UpdateCheck de cada propiedad de registro en Nunca.

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 con éxito. Sin reflexión ni nada, pero como dije, pierdes la comprobación de concurrencia.


No eliminaría / recrearía. Suponiendo que los dos objetos tienen la misma interfaz con respecto a las propiedades que desea actualizar, utilizaría la reflexión y copiaría 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, podría reutilizar la primera PropertyInfo en lugar de obtener una nueva para partialContent.



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

No, definitivamente no, solo considere 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.

Bagazo