Saltar al contenido

La forma correcta de insertar múltiples registros en una tabla usando LINQ to Entities

este problema se puede abordar de diversas formas, pero nosotros te damos la solución más completa en nuestra opinión.

Solución:

Simplemente mueva la creación de instancias del nuevo Producto dentro del ciclo. Su código, tal como está escrito, agregará una sola instancia varias veces, lo que no produce lo que busca… necesita una instancia separada de cada producto… el método Agregar no hace una copia, adjunta el objeto al contexto y lo marca para su inserción.

foreach (int price in prices)

   Product newProduct = new Product();
   newProduct.Price = price;
   NWEntities.Products.Add(newProduct);

Para ver lo que está sucediendo un poco más explícito, considere lo siguiente:

class Program

    static void Main(string[] args)
    
        Console.WriteLine("Try to reuse same Instance:");
        using (var ctx = new AdventureWorksEntities())
        
            List ids = new List 1, 2, 3; 
            Product p1 = new Product();
            Product reference = p1;
            Product p2;
            Console.WriteLine("Start Count: 0", ctx.Products.Count());
            foreach (var id in ids)
            
                p1.ProductID = id;
                p2 = ctx.Products.Add(p1);
                Console.WriteLine("p1 = p2 ? 0", p1 == p2);
                Console.WriteLine("p2 = reference? 0", p2 == reference);
                Console.WriteLine("State: 0", ctx.Entry(p1).State);
                var changes = ctx.ChangeTracker.Entries();
                Console.WriteLine("Change Count: 0", changes.Count());
            
        
        Console.WriteLine();
        Console.WriteLine("Distinct Instances:");
        using (var ctx = new AdventureWorksEntities())
        
            List ids = new List  1, 2, 3 ;
            Product p2;
            foreach (var id in ids)
            
                var p1 = new Product ProductID = id;
                p2 = ctx.Products.Add(p1);
                Console.WriteLine("p1 = p2 ? 0", p1 == p2);
                Console.WriteLine("State: 0", ctx.Entry(p1).State);
                var changes = ctx.ChangeTracker.Entries();
                Console.WriteLine("Change Count: 0", changes.Count());
            
        

        Console.ReadLine();
    

En el primer ciclo, está reutilizando la misma instancia de producto, pero cuando la agrega al contexto, solo está usando la misma referencia cada vez. Puede ver que el recuento de cambios permanece en 1 independientemente de cuántas veces se ejecute el bucle. Por supuesto, solo se guardarían los últimos valores si llamara a ctx.SaveChanges().

En la segunda versión, el recuento de cambios se incrementa correctamente cada vez y llamarías a SaveChanges para guardar todas las entidades distintas como era de esperar.

+1 por la respuesta de Terryt. Debe seguir con el método uno o algo similar.

En la versión 6 de Entity Framework, hay un nuevo método para agregar un conjunto de datos en una sola declaración. Este es el método AddRange.

Me gustaría agregar que el método AddRange me parece elegante cuando desea agregar entidades basadas en una lista existente (o IEnumerable).

En tu caso se podría hacer algo así:

NWEntities.Products.AddRange(
    Prices.Select(priceitem =>
    new Productprice = priceitem)
)

Semánticamente, esto debería ser similar a su método 1. Se instancia un objeto Producto por precio en la lista de precios. Sin embargo, hay una diferencia, se hace de forma anónima, por lo que no hay variables de referencia definidas explícitas que apunten al nuevo objeto.

Si el rendimiento es importante, esta pregunta podría brindarle más información: la forma más rápida de insertar en Entity Framework

Espero que esto te ayude.

Reseñas y valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *