Со следующей простой структурой реляционной базы данных: у Order есть один или несколько OrderItems, и у каждого OrderItem есть один OrderItemStatus.
Таблицы Order, OrderItem и OrderItemStatus, связанные с отношениями внешнего ключа http://www.mindthe.net/images/OrdersDB.jpg
Entity Framework v4 используется для связи с базой данных, и сущности были сгенерированы из этой схемы. В этом примере соединение сущностей называется EnumTestEntities.
Урезанная версия класса Order Repository выглядит следующим образом:
public class OrderRepository
{
private EnumTestEntities entities = new EnumTestEntities();
// Query Methods
public Order Get(int id)
{
return entities.Orders.SingleOrDefault(d => d.OrderID == id);
}
// Persistence
public void Save()
{
entities.SaveChanges();
}
}
Приложение MVC2 использует модели Entity Framework для управления представлениями. Я использую функцию EditorFor MVC2 для управления представлением редактирования.
Когда дело доходит до отправки любых изменений в модель, вызывается следующий код:
[HttpPost]
public ActionResult Edit(int id, FormCollection formValues)
{
// Get the current Order out of the database by ID
Order order = orderRepository.Get(id);
var orderItems = order.OrderItems;
try
{
// Update the Order from the values posted from the View
UpdateModel(order, "");
// Without the ValueProvider suffix it does not attempt to update the order items
UpdateModel(order.OrderItems, "OrderItems.OrderItems");
// All the Save() does is call SaveChanges() on the database context
orderRepository.Save();
return RedirectToAction("Details", new { id = order.OrderID });
}
catch (Exception e)
{
return View(order); // Inserted while debugging
}
}
Второй вызов UpdateModel имеет суффикс ValueProvider, который соответствует автоматически сгенерированным префиксам входных имен HTML, которые MVC2 сгенерировал для коллекции внешнего ключа OrderItems в представлении.
При вызове SaveChanges () в контексте базы данных после обновления коллекции OrderItems Order с помощью UpdateModel генерируется следующее исключение:
"The operation failed: The relationship could not be changed because one or more
of the foreign-key properties is non-nullable. When a change is made to a
relationship, the related foreign-key property is set to a null value. If the
foreign-key does not support null values, a new relationship must be defined,
the foreign-key property must be assigned another non-null value, or the
unrelated object must be deleted."
При отладке с помощью этого кода я все еще вижу, что EntityKeys не равны NULL и, по-видимому, имеют то же значение, что и должно быть. Это все еще происходит, когда вы не меняете какие-либо извлеченные детали заказа из базы данных. Кроме того, соединение сущности с базой данных не изменяется между действием Get и SaveChanges, так что это также не является проблемой контекста.
Есть идеи, что может быть причиной этой проблемы? Я знаю, что EF4 проделал работу со свойствами внешнего ключа, но кто-нибудь может пролить свет на то, как использовать EF4 и MVC2 для упрощения обновления; вместо того, чтобы заполнять каждое свойство вручную. Я надеялся, что простота EditorFor и DisplayFor также распространится на контроллеры, обновляющие данные.
Спасибо