Subsonic и Automapper - коллекция dirtyColumns пуста, поэтому не может обновляться

Я использую Subsonic 3 и Automapper в проекте asp.net MVC3.

В моем HttpPost ActionResult я беру свою модель и сопоставляю ее с моей сгенерированной Subsonic сущностью.

Сопоставление не работает, но я не могу обновить сущность.

При дальнейшем осмотре это связано с тем, что у меня нет грязных столбцов, поэтому мой вызов Update () не выполняется, поскольку Subsonic не думает, что ему нужно что-либо обновлять.

Я переделал загрузку кода - даже заставил метод снова загрузить сущность из базы данных перед сопоставлением с моделью. Просто кажется, что отображение разрушает отслеживание dirtyColumns. Например. если я сопоставлю после загрузки из БД, а затем изменю случайное свойство, оно не будет помечено как грязный столбец.

Я также пробовал использовать вызов метода SetIsLoaded (true). Никакой радости после составления карты.

Вот мой метод:

    [HttpPost]
    public virtual ActionResult Edit(SinglePersonModel model)
    {
        if (ModelState.IsValid)
        {
            Data.Person person;

            //Now Map my model to my entity - this works
            Mapper.CreateMap<SinglePersonModel, Data.Person>();
            person = Mapper.Map<SinglePersonModel, Data.Person>(model);

            //THIS DOESN'T SET MY COLUMN TO DIRTY
            person.Link = "asdjsadij";

            //THIS DOESN'T SET MY COLUMN TO DIRTY EITHER
            person.SetIsLoaded(true);
            person.Link = "asdjsadij";

            if (person.PersonId > 0)
                PersonRepository.UpdatePerson(person);
            else
                PersonRepository.CreatePerson(person);

            return RedirectToAction(MVC.SecureAdministration.Person.Index());
        }
        else return View(model);
    }

Статические методы в моем PersonRepository просто вызывают Subsonic Update () и Save () соответственно.

Любые идеи будут очень признательны. Теперь я думаю, что мне может потребоваться добавить некоторые дополнительные свойства в мою модель, чтобы убедиться, что они перенесены в сущность автоматическим преобразователем.

В худшем случае мне придется просто не использовать Automapper при обратном сопоставлении сущностей из модели, что было бы отстой.


person Ed Spencer    schedule 30.03.2011    source источник
comment
Я не совсем уверен (я не использовал дозвуковой режим), но я думаю, что если вы сначала загрузите физический объект из исходного местоположения, он будет помечен как грязный, когда вы обновите его с помощью автомаппера.   -  person Buildstarted    schedule 31.03.2011
comment
И да и нет. Если я снова загружу объект, а затем обновлю свойство, он будет помечен как грязный. (В любом случае я бы хотел избежать повторной загрузки объекта из БД). Однако, если я снова загружу объект, а затем сопоставлю его, ничего не будет помечено как грязное. Похоже, что автомаппер здесь слишком жесток в том, что он перезаписывает в целевом объекте. Я все равно могу получить грязные столбцы без повторной загрузки из источника - мне просто нужно вызвать person.SetIsLoaded (true). Опять же, это работает при обновлении свойства, но не при сопоставлении с ним.   -  person Ed Spencer    schedule 31.03.2011
comment
AutoMapper.Mapper.Map<SinglePersonModel, Data.Person>(model, person); - А ты так пробовал? Это не назначает новый экземпляр объекта, а присваивает его существующему объекту. Просто мысль. Я понимаю, что не хочу загружать его из базы данных. Но подумал, что это может немного помочь :)   -  person Buildstarted    schedule 31.03.2011
comment
Ага, это сработало! Должно быть, он каждый раз выбрасывал новый экземпляр. Возможно, вы захотите опубликовать ответ - Спасибо   -  person Ed Spencer    schedule 31.03.2011


Ответы (1)


AutoMapper.Mapper.Map<SinglePersonModel, Data.Person>(model, person); - А ты так пробовал? Это не назначает новый экземпляр объекта, а присваивает его существующему объекту. Просто мысль. Я понимаю, что не хочу загружать его из базы данных. Но подумал, что это может немного помочь :)

Спасибо за это - рад помочь :)

person Buildstarted    schedule 31.03.2011