Изменение состояния объекта для списка связанных объектов - PullRequest
1 голос
/ 21 марта 2012

Этот код:

orderContext.ShippingOrders.AddObject(shippingOrder);
orderContext.ObjectStateManager.ChangeObjectState(shippingOrder, System.Data.EntityState.Modified);

foreach (var shippingOrderItem in shippingOrder.ShippingOrderItems) {
    //Exception happens here.
    orderContext.ObjectStateManager.ChangeObjectState(shippingOrderItem, System.Data.EntityState.Modified);
}

Результаты в этом исключении: AcceptChanges cannot continue because the object's key values conflict with another object in the ObjectStateManager. Make sure that the key values are unique before calling AcceptChanges. Сообщение об исключении мне кажется смущающим, поскольку у меня есть только 1 объект, который является частью отношения (shippingOrderItem), поэтому не может быть дублирующего ключа.

Родительский объект (shippingOrder) находится в отдельном состоянии, и я не хочу вставлять новые shippingOrderItems; Я хочу обновить существующие. Как я могу изменить их состояние, которое будет изменено?

Структура псевдокласса для объекта, с которым я работаю, выглядит следующим образом:

public class ShippingOrder {
    public List<ShippingOrderItem> ShippingOrderItems { get; set; }
}

public class ShippingOrderItem {
    //This is the where I need to insert new records!  Everything else is an update.
    public List<ShippingOrderItemSerialNumber> ShippingOrderItemSerialNumbers { get; set; }
}

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

Порядок строк в вашем коде имеет значение.Я не могу объяснить, почему.Но я мог воспроизвести вашу ошибку и решить ее, поменяв несколько строк в вашем коде:

using (var orderContext = new ShippingEntities())
{
    orderContext.ShippingOrders.AddObject(shippingOrder);
    foreach (var shippingOrderItem in shippingOrder.ShippingOrderItems)
    {
        orderContext.ObjectStateManager.ChangeObjectState(
            shippingOrderItem, EntityState.Modified);
    }
    orderContext.ObjectStateManager.ChangeObjectState(
        shippingOrder, EntityState.Modified);

    orderContext.SaveChanges();
}

Это обновляет shippingOrder и все shippingOrder.ShippingOrderItems и вставляет все ShippingOrderItemSerialNumbers.Значения свойств первичного ключа для shippingOrder и shippingOrder.ShippingOrderItems должны быть правильными и соответствовать существующим строкам в базе данных.Значения свойства первичного ключа для ShippingOrderItemSerialNumbers не имеют значения, вы можете оставить их все 0 (если они являются автоматически генерируемыми идентификаторами в базе данных).

0 голосов
/ 21 марта 2012

Вы хотите присоединить его, а затем пометить как измененное (AddObject предназначен для добавления чего-либо, что будет вставкой, как говорит Слаума).

RIA делает это достаточно, чтобы они добавили метод расширения, чтобы сделать2 для вас:

http://msdn.microsoft.com/en-us/library/ff423414(VS.110).aspx

Однако сделать это самостоятельно довольно просто, конечно.

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