Хобрук: Ваш путь к мастерству в программировании

Проблема с отношением Linq2Sql «многие ко многим» и вставкой новых объектов

Я пытаюсь сделать простой 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.
    }
}

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


Ответы:


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

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

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

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

11.01.2009
  • Я на самом деле не совсем согласен с тем, что он поддерживает m2m. Преимущество любого другого O/R Mapper заключается в том, что вы можете сделать именно ту поперечную, которую вы упомянули (в обоих направлениях). User.Roles.Add(SomeRole), учитывая типичную схему user-user_role-role. 1..n Взаимосвязи хороши в Northwind, но Linq2SQL ужасно терпит неудачу, когда вы хотите пойти дальше (а вам почти всегда придется это делать). 27.10.2009

  • 2

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

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

    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

    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

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

    11.01.2009
  • Спасибо за ссылки. Вы абсолютно правы в том, что MM не имеет (собственной) поддержки в LINQ2SQL, а мост 1-M:M-1 является обычным методом. Не совсем уверен, что были отрицательные голоса. 29.12.2010
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..