Linq to SQL ForeignKeyReferenceAlreadyHasValueException - PullRequest
4 голосов
/ 09 декабря 2011

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

У меня есть служба WCF, которая используетLinq to SQL для извлечения, обновления и удаления объектов на моем SQL Server.

Я создал простую реляционную базу данных, которая имеет отношение 1 ко многим между Customer и Order, отношение 1 ко многим между Order и OrderDetails,

теперь в «Моих заказах» есть внешний ключ для CustomerID, а в OrderDetails есть «Foreign kwy для идентификатора заказа».

, однако «OrderDetails» также содержит FK для ProductID в таблице продуктов.

По сути, я сейчас пытаюсь изменить OrderDetails, используя OrderID и добавить другой продукт, используя ProductID.

У меня проблемы с этим, хотя я продолжаю получать ForeignKeyReferenceAlreadyHasValueException

Iнаписал это, что я знаю, совершенно неправильно, но в то время я не знал,(Я совершенно новичок в SQL, Linq для SQL и т. Д.), Что я не могу сделать это.

            OrderDetail item = new OrderDetail();                
            item.OrderID = orderItem.OrderID;
            item.ProductID = orderItem.ProductID;
            item.ProductQuantity = orderItem.ProductQuantity;                              
            jacksDB.OrderDetails.InsertOnSubmit(item);
            jacksDB.SubmitChanges();

Я прочитал, что мне нужно было отобразить сущность или что-то в этом направлении, используя общую строку кода, такуюкак это

            var order = jacksDB.Orders.Single(o => o.OrderID == orderItem.OrderID);
            var orderDetail = order.OrderDetails.Single(o => o.OrderID ==    orderItem.OrderID);
            orderDetail.ProductID = orderItem.ProductID;
            orderDetail.ProductQuantity = orderItem.ProductQuantity;
            orderDetail.Discount = orderItem.Discount;
            jacksDB.OrderDetails.InsertOnSubmit(orderDetail);
            jacksDB.SubmitChanges();

может кто-то показать, и если его не так уж много, попросите немного объяснить, как я могу правильно добавить вставку новой записи OrderDetail в мою таблицу OrderDetails, используя существующий OrderID (FK)чтобы «Редактировать и добавлять / удалять продукт в существующий заказ»

Заранее благодарим за помощь

Джон

1 Ответ

2 голосов
/ 09 декабря 2011

ОК, вы получаете эту ошибку,

http://msdn.microsoft.com/en-us/library/system.data.linq.foreignkeyreferencealreadyhasvalueexception.aspx

1006 * ForeignKeyReferenceAlreadyHasValueException *

И ссылка говорит об этом,

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

Я думаю, что вам нужно загрузить ордер, о котором вы говорите, и он будет иметь список OrderDetails, связанный с ним. Если вы хотите удалить одну из этих ссылок, вам нужно удалить OrderDetail из списка OrderDetails.

Я думаю, тебе нужно сделать что-то подобное,

using (DataClasses1DataContext context = new DataClasses1DataContext())
{
    Customer customer = context.Customers.Where(x => x.CustomerID == 1).Single();
    Order order = new Order();
    // set some order fields here
    customer.Orders.Add(order);

    OrderDetail orderDetail = new OrderDetail();
    order.OrderDetails.Add(orderDetail);

    orderDetail.Product = context.Products.Where(x => x.ProductID == 2).Single();
    orderDetail.ProductID = orderDetail.Product.ProductID;

    context.SubmitChanges();
}

Попробуйте это без InsertOnSubmit, но сохраните SubmitChanges. Я полагаю, что поскольку вы уже добавляете запись, установив это,

order.OrderDetails.Add(orderDetail);

Так что вам, вероятно, не нужно вставлять его снова.

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