Проблема с отношением «многие ко многим» Linq2Sql и вставкой новых объектов - PullRequest
4 голосов
/ 11 января 2009

Я пытаюсь сделать простой linq 2 sql многие ко многим, вставить некоторые данные, операция.

вот модель Northwind, представляющая многие ко многим:

альтернативный текст http://www.iaingalloway.com/images/linq-detail.jpg

Теперь я пытаюсь вставить новый заказ и, если товара не существует, вставить его одновременно в ту же транзакцию. Я получаю ошибку:

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

Итак, это мой (псевдо) код:

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.
    }
}

Я предполагаю, что мне нужно сначала сохранить продукты, прежде чем пытаться сохранить заказ? Я так растерялся: (

Ответы [ 2 ]

2 голосов
/ 11 января 2009
// Associate each product to the a new order_detail.
orderDetailList.Add(new Order_Detail
{
    Product = new SqlContext.Product
    {
        Foo = product.Foo
    }
});

Одна вещь, которая здесь не так, это то, что вы создаете новый продукт для установки в свойстве Order_Detail.Product. Вместо этого вы должны взять продукт, поступающий из базы данных, и установить его в свойстве.

Я не уверен, какой порядок имеет внутри .ProductList - если эти продукты загружаются из базы данных, вам следует установить их непосредственно в свой Order_Detail.Product вместо создания нового SqlContext.Product.

@ jfar L2S поддерживает отношения многие ко многим, вы просто не можете иметь свойство Products в вашем Заказе (в этом случае это действительно хорошая вещь, потому что OrderDetails имеет количество и другие свойства). ).

0 голосов
/ 11 января 2009

Отношения многие ко многим не поддерживаются в Linq2Sql. (

Есть несколько обходных путей:

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

Странно, что изображение вашей схемы БД такое же, как в одной из статей ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...