2009-01-11 5 views
4

Je suis en train de faire un linq 2 sql simple-à-plusieurs, insérer des données, opération.Problème avec Linq2Sql relation plusieurs-à-plusieurs et insertion de nouveaux objets

est ici le modèle de stock Northwind représentant un nombre à plusieurs:

alt text http://www.iaingalloway.com/images/linq-detail.jpg

Maintenant, ce que je suis en train de faire est d'insérer un nouvel ordre et si le produit n'existe pas, insérer ce à en même temps, dans la même transaction. L'erreur que je reçois est:

System.Data.Linq.DuplicateKeyException: Cannot add an entity with a 
key that is already in use. 

Alors ceci est mon (pseduo) Code:

using (SqlContext db = new SqlContext()) 
{ 
    // Get existing or create a new instance. 
    Order newOrder = GetOrder(order.Id) ?? new Order(); 
    // Left to right stuff. 
    newOrder.Foo = order.Foo; 

    // Now associate this new order to a product (which might not exist). 
    if (!order.ProductList.IsNullOrEmpty()) 
    { 
     // We have some products... 

     IList<Order_Detail> orderDetailList = new List<Order_Detail>(); 
     foreach(Models.Product product in order.ProductList) 
     { 
      // Associate each product to the a new order_detail. 
      orderDetailList.Add(new Order_Detail 
            { 
             Product = new SqlContext.Product 
                 { 
                  Foo = product.Foo 
                 } 
            }); 
     } 

     // Now associate all the order_details to this order. 
     newOrder.Order_Details.AddRange(orderDetailList); 

     if (newOrder.Id <= 0) 
      db.InsertOnSubmit(newOrder); 

     db.SubmitChanges(); // <-- exception throw here. 
    } 
} 

Je suppose que je dois enregistrer les produits d'abord avant que j'essayer de sauver l'ordre? Je suis tellement confus :(

Répondre

-1

Beaucoup de nombreuses relations ne sont pas pris en charge dans Linq2Sql :(

Il y a deux solutions de contournement.

http://www.iaingalloway.com/many-to-many-relationships-in-linq-to-sql

http://blogs.msdn.com/mitsu/archive/2008/03/19/how-to-implement-a-many-to-many-relationship-using-linq-to-sql-part-ii-add-remove-support.aspx

Bizarre que l'image de votre schéma db est la même que l'un des articles ...

+0

Merci pour les liens. Vous avez absolument raison de dire que M-M n'a pas de support (natif) dans LINQ2SQL et qu'un pont 1-M: M-1 est la méthode normale. Pas tout à fait sûr qu'il y avait des votes négatifs. –

2
// Associate each product to the a new order_detail. 
orderDetailList.Add(new Order_Detail 
{ 
    Product = new SqlContext.Product 
    { 
     Foo = product.Foo 
    } 
}); 

Une chose qui ne va pas ici, c'est que vous créez un nouveau produit à définir sur votre propriété Order_Detail.Product. Au lieu de cela, vous devez prendre le produit qui provient de la base de données et le définir sur la propriété. Je ne suis pas sûr ce que order.ProductList a à l'intérieur - si ces produits sont chargés à partir de la base de données, alors vous devez les définir directement à votre Order_Detail.Product au lieu de faire de nouveau SqlContext.Product.

@jfar L2S ne supporte plusieurs à plusieurs relations, vous ne pouvez pas avoir une propriété des produits sur votre commande (dans ce cas, cela est en fait une bonne chose parce que OrderDetails a quantité et d'autres propriétés).

+0

En fait, je ne suis pas vraiment d'accord pour dire qu'il "supporte m2m". La bonne chose à propos de tout autre O/R Mapper est que vous pouvez faire exactement ce que vous mentionnez transversal (les deux façons). User.Roles.Add (SomeRole), étant donné le schéma type user-user_role-role. 1..n Les relations sont sympas dans Northwind, mais Linq2SQL tombe terriblement court quand on veut aller au-delà (et il faudra presque toujours le faire). –

Questions connexes