【问题标题】:NullReferenceException while using Null Propagation [duplicate]使用 Null 传播时出现 NullReferenceException [重复]
【发布时间】:2018-11-06 03:25:42
【问题描述】:

我正在使用 .NET Core 2.1.200 开发一个 ASP.NET Core MVC 应用程序。

我有一个响应模型和一个静态方法来从实体模型构建这个响应模型。

public static EntityTypeResponseModel FromEntityType(Entity.EntityType entityType)
{
    return new EntityTypeResponseModel
    {
        Id = entityType.Id,
        Name = entityType.Name,

        // NullReferenceException
        Fields = entityType.EntityTypeFields?.Select(x => FieldResponseModel.FromField(x.Field))
    };
}

虽然我使用 null 传播,但会引发 NullReferenceException。

执行传统的 null 检查可以解决问题:

public static EntityTypeResponseModel FromEntityType(Entity.EntityType entityType)
{
    var entityTypeResponseModel = new EntityTypeResponseModel
    {
        Id = entityType.Id,
        Name = entityType.Name
    };

    if (entityType.EntityTypeFields != null)
    {
        entityTypeResponseModel.Fields =
            entityType.EntityTypeFields?.Select(x => FieldResponseModel.FromField(x.Field));
    }

    return entityTypeResponseModel;
}

我错过了什么吗?这是一个错误吗?

【问题讨论】:

  • 调试时究竟哪个引用为空?
  • 检查EntityTypeFields(集合)不是null 并没有检查x(元素)也不是nullx.Field 的类型是什么,.FromField 方法有什么作用?

标签: c# nullreferenceexception c#-6.0 null-propagation-operator


【解决方案1】:

这是我自己的错误。方法FieldResponseModel.FromField 需要一个不能为空的字段。

在实体中,我添加了实体(同时通过我的控制器的编辑操作),但通过 ID 而不是通过实体对象。通过await _db.SaveChangesAsync()将此对象保存到数据库上下文后,ID-property 的导航属性没有自动设置(这是我所期待的)。

我最终自己从数据库中获取了实体并设置了实体对象。

// bad
junctionEntity.FieldId = 1

// good
junctionEntity.Field = await _db.Fields.SingleAsync(x => x.Id == 1)

适合我,可能还有其他解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2015-05-01
    • 2012-06-25
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多