我遇到了一个有趣的问题(希望,有趣的不仅仅是对我来说)。
我正在运行实体框架1(.NET 3.5)和ASP.NET MVC 2.我有一个Customer类与Country类具有多对一关系(换句话说,Country是客户的查找表 - 我在这篇文章中描述了更多:Explicit casting doesn't work in default model binding)
我让TypeConverter工作;所以我在控制器的Post方法中得到了一个完美的对象。创造工作正常;但是,在编辑中,当我调用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
状态。所以,最终的问题是,如何在仍然使用TypeConverter时阻止对象变为Added
...
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);
}
UPDATE 2 :FWIW,我可以看到当DefaultModelBinder :: SetProperty调用propertyDescriptor.SetValue(bindingContext.Model, value);
时状态发生了变化由于PropertyDescriptor不是MVC的一部分,我无法进一步调试。任何人都知道为什么PropertyDescriptor将模型标记为“已添加”,我该怎么办呢?