Обновление объекта связанными объектами из отдельного состояния - PullRequest
0 голосов
/ 19 марта 2012

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

Сейчас у меня есть форма, которую пользователь может редактировать, которая содержит родительскую запись, а затем два списка родительских записей.

Когда данные отправляются на сервер, я беру свои модели представлений и сопоставляю их с объектами инфраструктуры сущностей с помощью AutoMapper. Данные выглядят хорошо; AutoMapper отображает данные правильно.

Когда я прикрепляю объект, чтобы я мог его обновить, выдается исключение: A referential integrity constraint violation occurred: The property values that define the referential constraints are not consistent between principal and dependent objects in the relationship.

public static void UpdateOrder(ShippingOrder shippingOrder) {
    using (OrderEntity orderContext = new OrderEntity()) {
        //Exception happens here
        orderContext.ShippingOrders.Attach(shippingOrder);
        //Update the order itself; mark the order has being modified so the EF will update it.
        orderContext.ObjectStateManager.ChangeObjectState(shippingOrder, System.Data.EntityState.Modified);
        //Perform the update.
        orderContext.SaveChanges();
    }
}

EntityFramework (EF), похоже, считает, что мои ключи не совпадают, но я не уверен, что не правильно. Свойство внешнего ключа имеет правильное значение, поэтому я не уверен, что он проверяет. У кого-нибудь есть идеи?

Ответы [ 3 ]

3 голосов
/ 11 сентября 2012

Вы можете попробовать что-то вроде этого:

ShippingOrder existingShippingOrder = orderContext.ShippingOrders.Find(shippingOrder.ID);
orderContext.Entry(existingShippingOrder ).CurrentValues.SetValues(shippingOrder);
0 голосов
/ 20 марта 2012

как объяснено здесь

Вставка или обновление шаблона. Обычный шаблон для некоторых приложений - либо Добавить объект как новый (что приводит к созданию базы данных).вставить) или присоединить объект как существующий и пометить его как измененный (что приведет к обновлению базы данных) в зависимости от значения первичного ключа.Например, при использовании сгенерированных базой данных целочисленных первичных ключей обычно трактуют объект с нулевым ключом как новый, а объект с ненулевым ключом - как существующий.Этот шаблон может быть достигнут путем установки состояния объекта на основе проверки значения первичного ключа.Например:

public void InsertOrUpdate(DbContext context, Unicorn unicorn)
{
    context.Entry(unicorn).State = unicorn.Id == 0 ?
                                   EntityState.Added :
                                   EntityState.Modified;
    context.SaveChanges();
}

вы можете попробовать

public static void UpdateOrder(ShippingOrder shippingOrder) {
    using (OrderEntity orderContext = new OrderEntity()) {       
        orderContext.Entry(shippingOrder).State = shippingOrder.Id==0?
                                                  EntityState.Added :
                                                  EntityState.Modified;

        orderContext.SaveChanges();
    }
}

ОБНОВЛЕНИЕ:

для ObjectContext класса выможно попробовать

 public static void UpdateOrder(ShippingOrder shippingOrder) {
        using (OrderEntity orderContext = new OrderEntity()) {                  
            orderContext.ObjectStateManager.ChangeObjectState(shippingOrder, EntityState.Modified);    
            orderContext.SaveChanges();
        }
    }
0 голосов
/ 19 марта 2012

вместо

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

попробуйте это

orderContext.Entry(ShippingOrder).State = EntityState.Modified;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...