TypeConverter阻止EntityFramework中的ApplyPropertyChanges

时间:2010-03-14 17:39:10

标签: asp.net-mvc entity-framework asp.net-mvc-2 type-conversion

我遇到了一个有趣的问题(希望,有趣的不仅仅是对我来说)。

我正在运行实体框架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将模型标记为“已添加”,我该怎么办呢?

0 个答案:

没有答案