我正在try 使用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);
}

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

如果没有的话,当我try 拥有外部密钥之类的东西时,我应该如何手动创建记录呢?

SwaggerUI

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

推荐答案

这就是为什么您可能更喜欢使用DTO而不是实体类作为API的输入/输出的原因之一.在这个特殊的情况下,你基本上在HotelAddress之间有一个循环关系,这不仅打破了大摇大摆的状态,而且需要跳过一些环(如果可能的话)才能发布这样的模型.作为一个快速解决方案,您可以将wine 店作为关系的一部分(从EF Core设计的Angular 来看,这并不理想):

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; }
}

Csharp相关问答推荐

无法更改或使用C#(WinForms.NET)中的全局变量

如何使用Unity和MRTK3将手网添加到Hololens 2应用程序中

有没有一种方法可以在包含混合文本的标签中嵌入超链接?

在C#中,DirectoryEntry返回空AuditRules集合,即使审计规则确实存在

将轮询与超时同步

无法创建';';类型的';DbContext';.异常';无法解析类型';Microsoft.EntityFrameworkCore.DbContextOptions`1[Comm的服务

未找到任何HTTP触发器.成功部署Azure Functions Project后(c#)

具有以接口为其类型的属性的接口;类指定接口的实现,但无效

try 链接被委派者(多播委托)时,无法将获取运算符应用于类型为';方法组&39;和方法组';的操作数

VS 2022与VS 2019:如何/为什么创建额外的任务?

C#LINQ子字符串

如何在同一成员上组合[JsonPropertyName]和[ObservableProperty]?

MudBlazor Textfield已禁用,但其验证工作正常

如何在特定环境中运行dotnet测试?

如何在使用属性 Select 器时判断是否可以为空

基于C#方法的EF核心过滤查询(缓冲与流)

在构造函数中传递C#函数以用作EventHandler委托的订阅服务器

为什么我的自定义Json.net转换器不工作?

映射器-如何映射到多个实体

避免在特定区域中设置Visual Studio代码的自动格式