我在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,这会很糟糕。
答案 0 :(得分:1)
AutoMapper.Mapper.Map<SinglePersonModel, Data.Person>(model, person);
- 你试过这样的吗?这不会分配对象的新实例,而是将其分配给现有对象。只是一个想法。我理解不想从db加载它。但想到这可能会有所帮助:)
谢谢你 - 很高兴帮忙:)