NSwag генерирует базовый класс, даже если установлен атрибут JsonSchemaFlattenAttribute

#asp.net-core #.net-core #swagger #swagger-codegen #nswag

#asp.net-core #.net-core #развязность #swagger-codegen #nswag

Вопрос:

Я использую NSwag для своего ASP.NET Основной проект веб-api и просто не могу заставить его работать. Что я пытаюсь сделать, так это исключить некоторые базовые свойства IdentityUser . Вот мой пользовательский пользовательский класс:

 [DataContract]
[JsonSchemaFlattenAttribute]
public class User : IdentityUser
{
    // Overridden variables
    [DataMember( Name = "id" )]
    [PersonalData]
    public new string Id { get; set; }

    [DataMember( Name = "email" )]
    [ProtectedPersonalData]
    public new string Email { get; set; }

    [IgnoreDataMember]
    [JsonSchemaIgnoreAttribute]
    public new DateTimeOffset? LockoutEnd { get; set; }

    [PersonalData]
    [IgnoreDataMember]
    [JsonSchemaIgnoreAttribute]
    public new bool TwoFactorEnabled { get; set; }

    [PersonalData]
    [IgnoreDataMember]
    [JsonSchemaIgnoreAttribute]
    public new bool PhoneNumberConfirmed { get; set; }

    [ProtectedPersonalData]
    [IgnoreDataMember]
    [JsonSchemaIgnoreAttribute]
    public new string PhoneNumber { get; set; }

    [IgnoreDataMember]
    [JsonSchemaIgnoreAttribute]
    public new string ConcurrencyStamp { get; set; }

    [IgnoreDataMember]
    [JsonSchemaIgnoreAttribute]
    public new string SecurityStamp { get; set; }

    [IgnoreDataMember]
    [JsonSchemaIgnoreAttribute]
    public new string PasswordHash { get; set; }

    [PersonalData]
    [IgnoreDataMember]
    [JsonSchemaIgnoreAttribute]
    public new bool EmailConfirmed { get; set; }

    [IgnoreDataMember]
    [JsonSchemaIgnoreAttribute]
    public new string NormalizedEmail { get; set; }

    [IgnoreDataMember]
    [JsonSchemaIgnoreAttribute]
    public new string NormalizedUserName { get; set; }

    [ProtectedPersonalData]
    [IgnoreDataMember]
    [JsonSchemaIgnoreAttribute]
    public new string UserName { get; set; }

    [IgnoreDataMember]
    [JsonSchemaIgnoreAttribute]
    public new bool LockoutEnabled { get; set; }

    [IgnoreDataMember]
    [JsonSchemaIgnoreAttribute]
    public new int AccessFailedCount { get; set; }

    // Custom variables
    [DataMember( Name = "date_joined_utc" )]
    public DateTime DateJoinedUtc { get; set; }

    [IgnoreDataMember]
    [JsonSchemaIgnoreAttribute]
    public virtual ICollection<RefreshToken> RefreshTokens { get; set; }

    // Optimistic concurrency
    [Timestamp]
    [IgnoreDataMember]
    [JsonSchemaIgnoreAttribute]
    public byte[] RowVersion { get; set; }
}
  

Который генерирует:

 "User": {
  "type": "object",
  "required": [
    "dateJoinedUtc"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "email": {
      "type": "string"
    },
    "dateJoinedUtc": {
      "type": "string",
      "format": "date-time"
    }
  },
  "allOf": [
    {
      "$ref": "#/definitions/IdentityUserOfString"
    },
    {}
  ]
},
"IdentityUserOfString": {
  "type": "object",
  "required": [
    "emailConfirmed",
    "phoneNumberConfirmed",
    "twoFactorEnabled",
    "lockoutEnabled",
    "accessFailedCount"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "userName": {
      "type": "string"
    },
    "normalizedUserName": {
      "type": "string"
    },
    "email": {
      "type": "string"
    },
    "normalizedEmail": {
      "type": "string"
    },
    "emailConfirmed": {
      "type": "boolean"
    },
    "passwordHash": {
      "type": "string"
    },
    "securityStamp": {
      "type": "string"
    },
    "concurrencyStamp": {
      "type": "string"
    },
    "phoneNumber": {
      "type": "string"
    },
    "phoneNumberConfirmed": {
      "type": "boolean"
    },
    "twoFactorEnabled": {
      "type": "boolean"
    },
    "lockoutEnd": {
      "type": "string",
      "format": "date-time"
    },
    "lockoutEnabled": {
      "type": "boolean"
    },
    "accessFailedCount": {
      "type": "integer",
      "format": "int32"
    }
  }
},
  

Мое понимание JsonSchemaFlattenAttribute заключается в том, что он должен исключать базовые классы и помещать каждое свойство в производный класс. Итак, почему генерируется класс IdentityUserOfString? Чего мне не хватает?

Комментарии:

1. Вот исходный код JsonSchemaFlattenAttribute . В ссылке SeppPenner сказано, что это то, что он искал. Возможно, атрибут JsonSchemaFlattenAttribute может работать только для пользовательского базового класса.

Ответ №1:

По какой-то причине установка OpenApiIgnore для пользовательского класса решила эту проблему:

 [DataContract]
//[JsonSchemaFlattenAttribute]
[OpenApiIgnore]
public class User : IdentityUser
  

Генерирует:

 "User": {
  "type": "object",
  "required": [
    "dateJoinedUtc"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "email": {
      "type": "string"
    },
    "dateJoinedUtc": {
      "type": "string",
      "format": "date-time"
    }
  }
},