TypeConverter предотвращает ApplyPropertyChanges в EntityFramework - PullRequest
2 голосов
/ 14 марта 2010

Я столкнулся с интересной проблемой (надеюсь, интересной не только для меня:)

Я использую 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 как «добавленную» и что я могу с этим сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...