Я столкнулся с интересной проблемой (надеюсь, интересной не только для меня:)
Я использую Entity Framework 1 (.NET 3.5) и ASP.NET MVC 2. У меня есть класс Customer, который имеет отношение многие-к-одному с классом Country (иными словами, Country - это таблица поиска для клиентов - Я описал больше в этом посте: Явное приведение не работает в привязке модели по умолчанию )
Я получил TypeConverter для работы; поэтому я получаю идеальный объект в метод Post контроллера. Создать работает отлично; тем не менее, в Edit я получаю следующую ошибку при вызове ApplyPropertyChanges:
Существующий объект в ObjectContext находится в состоянии добавлено. Изменения могут применяться только тогда, когда существующий объект находится в неизмененном или измененном состоянии.
Код контроллера довольно тривиален:
public ActionResult Edit(Customer customerToEdit) {
if (ModelState.IsValid) {
Customer cust = (Customer)context.GetObjectByKey(
new EntityKey("BAEntities.Customers", "CustomerID", customerToEdit.CustomerID));
context.ApplyPropertyChanges(cust.EntityKey.EntitySetName, customerToEdit);
context.SaveChanges();
}
return View(...);
}
Если я удаляю страну из формы, она работает нормально; и если я присваиваю выпадающее значение EntityReference "вручную" - это также работает. ОБНОВЛЕНИЕ: похоже, что если у меня нет поля поиска, то customerToEdit находится в состоянии Unchanged
(как я и ожидал); однако, если поиск там и TypeConverter вызывается - объект теперь находится в состоянии Added
. Итак, главный вопрос: как я могу предотвратить превращение объекта в Added
, все еще используя TypeConverter ...
Код TypeConverter также довольно прост, но я никогда раньше не использовал TypeConverter, поэтому я могу что-то здесь упустить:
public override object ConvertFrom(ITypeDescriptorContext typeContext, CultureInfo culture, object value) {
if (value is string) {
int countryID = Int16.Parse((string)value);
Country country = (Country)context.GetObjectByKey(
new EntityKey("BAEntities.Countries", "CountryID", countryID));
return country;
}
return base.ConvertFrom(typeContext, culture, value);
}
ОБНОВЛЕНИЕ 2 : FWIW, я вижу, что состояние изменяется, когда вызывается DefaultModelBinder :: SetProperty propertyDescriptor.SetValue(bindingContext.Model, value);
Поскольку PropertyDescriptor не является частью MVC, я не могу отлаживать дальше. Кто-нибудь знает, почему PropertyDescriptor помечает Model как «добавленную» и что я могу с этим сделать?