Subsonic和Automapper - dirtyColumns集合为空,因此无法更新

时间:2011-03-30 20:10:19

标签: asp.net-mvc-3 subsonic3 automapper

我在asp.net MVC3项目中使用Subsonic 3和Automapper。

在我的HttpPost ActionResult中,我正在使用我的模型并将其映射到我的Subsonic生成的实体。

映射不起作用,但我无法更新实体。

经过进一步检查,这是因为我没有脏列,因此我对Update()的调用失败,因为Subsonic认为它不需要更新任何内容。

我重新编写了代码加载 - 甚至强制该方法在映射到模型之前再次从db加载实体。似乎映射会破坏dirtyColumns跟踪。例如。如果我在从DB加载后进行映射,然后更改随机属性,则不会将其标记为脏列。

我也尝试过使用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,这会很糟糕。

1 个答案:

答案 0 :(得分:1)

AutoMapper.Mapper.Map<SinglePersonModel, Data.Person>(model, person); - 你试过这样的吗?这不会分配对象的新实例,而是将其分配给现有对象。只是一个想法。我理解不想从db加载它。但想到这可能会有所帮助:)

谢谢你 - 很高兴帮忙:)