我正在尝试使用 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);
}
所以问题是:我做错了什么?
如果什么都没有,当我尝试拥有外键和其他东西时,我该如何手动创建记录?
我多次尝试以不同的方式创建一对多关系,我认为这是关于我的代码错误的,我认为通过修复我的模型类 Swagger UI 将使创建新记录变得更容易(基本上执行 post 方法) )但是当 Swagger 给我提供的格式认为我要编写酒店模型和 Id 时,我感到很困惑,它们不应该是自动化的吗?
这就是您可能更喜欢使用 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; }
}