【发布时间】:2012-09-27 11:01:02
【问题描述】:
我最近将我的项目迁移到 MVC4 Web API。在此之前,我使用标准 MVC 控制器。回发实体后,我使用 UpdateModel 更新模型,然后使用 [dbContext].SaveChanges(); 将其持久化到数据库中;
一切正常,但在 Web API 中没有 UpdateModel。所以我寻找了一个替代方案:AutoMapper。
我首先使用 EF 5 代码,然后使用实体类作为 MVC 的模型。
我的模型类(简化)如下所示:
public class Model
{
[ForeignKey("Parent")]
public Guid ParentId { get; set; }
[IgnoreDataMember]
public TParentEntity Parent { get; set; }
public string Name { get; get; }
}
当模型以 JSON 格式发送时,Parent 属性在序列化过程中被忽略。
因此,当在我的 api 控制器上使用实体调用 PUT(更新)方法时,Parent 属性为空。
PUT 方法的代码如下:
public void Put(Model model)
{
var contextModel = Repository.GetOne(model.Id);
Mapper.CreateMap<Model , Model>();
Mapper.Map(model, contextModel);
Repository.Update();
}
Parent 属性在模型中为空,但在 contextModel 中不为空。 AutoMapper 只是用 null 覆盖 contextModel 中的 Parent 属性。
然后,当我保存时,我得到一个 InvalidOperationException,尽管 ParentId 存在:
操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
感谢任何有关如何以不同方式执行此操作的解决方案或建议。
【问题讨论】:
-
无关 - 除了启动代码之外,您不应在任何地方调用 createmap。它只意味着运行一次,并且不是线程安全的。
标签: ef-code-first asp.net-web-api automapper automapper-2