无法使用具有一对多关系的 C# 类中的 Swagger 创建记录

问题描述 投票:0回答:1

我正在尝试使用 ASP.NET Core API 和 Angular 创建预订类型网站。

我陷入了模型/关系的困境。

这是

Hotel
模型类:

public class Hotel
{
    [Key]
    public int HotelId { get; set; }

    // Hotel name
    [Column(TypeName = "nvarchar(50)")]
    public string HotelName { get; set; }

    [Range(1,5,ErrorMessage = "Hotel Star Rating Value Must be in between of 1 and 5.")]
    public byte Stars { get; set; }

    // Hotel address linked to Hotel class.
    public virtual ICollection<Address> HotelAddresses { get; set; }

    // Hotel rooms linked to hotel class.
    public virtual ICollection<Room> Rooms { get; set; }
}

这是

Address
模型类:

public class Address
{
    [Key]
    public int AddressId { get; set; }

    [Column(TypeName = "nvarchar(50)")]
    public string Country { get; set; }

    [Column(TypeName = "nvarchar(50)")]
    public string City { get; set; }

    [Column(TypeName = "nvarchar(50)")]
    public string Street { get; set; }

    // one-to-many.
    [ForeignKey("hotel")]
    public int HotelId { get; set; }
    public virtual Hotel hotel { get; set; }
}

这是

Room
模型类:

public class Room
{
    [Key]
    public int RoomId { get; set; }

    [Column(TypeName ="nvarchar(50)")]
    public string Name { get; set; }

    [Column(TypeName = "nvarchar(250)")]
    public string Description { get; set; }

    public decimal price { get; set; }

    // one-to-many
    [ForeignKey("hotel")]
    public int HotelId { get; set; }
    public virtual Hotel hotel { get; set; }
}

控制器动作方法:

[HttpPost]
public async Task<ActionResult<Hotel>> PostHotel(Hotel hotel)
{
    _context.Hotels.Add(hotel);
    await _context.SaveChangesAsync();

    return CreatedAtAction("GetHotel", new { id = hotel.HotelId }, hotel);
}

所以问题是:我做错了什么?

如果什么都没有,当我尝试拥有外键和其他东西时,我该如何手动创建记录?

SwaggerUI

我多次尝试以不同的方式创建一对多关系,我认为这是关于我的代码错误的,我认为通过修复我的模型类 Swagger UI 将使创建新记录变得更容易(基本上执行 post 方法) )但是当 Swagger 给我提供的格式认为我要编写酒店模型和 Id 时,我感到很困惑,它们不应该是自动化的吗?

c# angular swagger asp.net-core-webapi swagger-ui
1个回答
0
投票

这就是您可能更喜欢使用 DTO 而不是实体类作为 API 输入/输出的原因之一。在这种特殊情况下,您基本上在

Hotel
Address
之间存在循环关系,这不仅打破了招摇,而且还需要跳一些圈子(如果可能的话)来发布这样的模型。作为快速解决方案,您可以将酒店作为关系的一部分可选(从 EF Core 设计的角度来看,这并不理想):

public class Adress
{
    // ...
    [JsonIgnore]
    public virtual Hotel? Hotel { get; set; }    
}

但我强烈建议创建一组单独的对象。例如:

public class CreateHotelRequest
{
    public required string HotelName { get; set; }
    [Range(1,5,ErrorMessage = "Hotel Star Rating Value Must be in between of 1 and 5.")]
    public required byte Stars { get; set; }

    public virtual ICollection<AddressDto> HotelAdresses { get; set; }
    public virtual ICollection<RoomDto> Rooms { get; set; }
}

例如

AddressDto

public class AddressDto
{
    public required string Country { get; set; }

    public required string City { get; set; }

    public required string Street { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.