【问题标题】:No way to save entity when navigation properties are null, but Ids are filled导航属性为空时无法保存实体,但 Id 已填充
【发布时间】: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


【解决方案1】:

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

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

Mapper.CreateMap<Model , Model>().For(m => m.Parent, opt => opt.Ignore());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 2016-03-29
    • 2013-09-30
    • 1970-01-01
    相关资源
    最近更新 更多