2

我最近将我的项目迁移到 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 存在:

操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

任何有关如何以不同方式执行此操作的解决方案或建议都将受到赞赏。

4

1 回答 1

0

我强烈建议不要发回您的实体,而是使用 dto,只使用您希望能够更新的属性。

但是,您可以通过在映射规则中添加忽略来解决此问题(目前)。

Mapper.CreateMap<Model , Model>().For(m => m.Parent, opt => opt.Ignore());
于 2012-10-06T19:51:56.443 回答