Это принятый ответ на этот вопрос Сильно типизированный ASP.NET MVC с Entity Framework
context.AttachTo(product.GetType().Name, product);
ObjectStateManager stateMgr = context.ObjectStateManager;
ObjectStateEntry stateEntry = stateMgr.GetObjectStateEntry(model);
stateEntry.SetModified();
context.SaveChanges();
Вы пробовали это?
[Обновлено, код сверху не работает]
Это небольшое расширение, которое я использовал, поэтому следующий блок кода легче понять:
public partial class Product
{
public int? CategoryID
{
set
{
CategoryReference.EntityKey = new EntityKey("ShopEntities.Categories", "CategoryID", value);
}
get
{
if (CategoryReference.EntityKey == null)
return null;
if (CategoryReference.EntityKey.EntityKeyValues.Count() > 0)
return (int)CategoryReference.EntityKey.EntityKeyValues[0].Value;
else
return null;
}
}
}
и это сработало для меня (на этот раз точно):
System.Data.EntityKey key = new System.Data.EntityKey("ShopEntities.Products", "ProductID", productId);
object originalItem;
product.EntityKey = key;
if (context.TryGetObjectByKey(key, out originalItem))
{
if (originalItem is EntityObject &&
((EntityObject)originalItem).EntityState != System.Data.EntityState.Added)
{
Product origProduct = originalItem as Product;
origProduct.CategoryID == product.CategoryID;//set foreign key again to change the relationship status
context.ApplyPropertyChanges(
key.EntitySetName, product);
}
}context.SaveChanges();
Конечно, это выглядит неприлично. Я думаю, что причина в том, что отношения EF имеют статус сущностей (изменен, добавлен, удален), и на основании этого состояния EF изменяет значение внешних ключей или удаляет строку, если имеется отношение многие ко многим. По какой-то причине (не знаю почему) статус отношений не изменяется так же, как статус свойства. Вот почему я должен был установить CategoryReference.EntityKey для originalItem, чтобы изменить статус отношения.