【问题标题】:Do I need to define any relationship between these two entities?我需要定义这两个实体之间的任何关系吗?
【发布时间】:2021-08-24 00:11:48
【问题描述】:

大家好,很抱歉这个菜鸟问题。我目前正在为 Travel Planner & Assistant Web 应用程序开发 ASP.NET Core 3.1 WebAPI。我正在使用 EF Core 和 Identity。

我的模型由以下类组成:

VacationReservationHotelRoomReview,自定义IdentityUserRecordUserRecord,以便更好地管理创建和修改日期和用户。

每个Vacation 都有一个List<Reservation>;每个Hotel 都有一个List<Room> 和一个List<Review>

我的问题是,我应该定义ReservationRoom 之间的任何关系吗?

我认为每个Reservation 都应该知道要预订哪个Room,因此将Room 放在里面似乎是合乎逻辑的。但是Room 的那个实例已经存在于HotelList<Room> 中。

【问题讨论】:

    标签: c# asp.net asp.net-core asp.net-web-api entity-framework-core


    【解决方案1】:

    我认为每个预订都应该知道要预订哪个房间, 所以把房间放在里面似乎是合乎逻辑的。但是那个房间的例子 已存在于酒店列表中。

    你所坚持的是完全正确的。您无需将 Reservation 类型的集合导航属性(例如 List<Reservation>)添加到您的 Room 实体中。

    通过在Reservation 实体上添加Room 导航属性,EF Core 可以处理剩余的事情,并且通过应用默认约定,它会认为预订是针对一个房间的,即使您也可以将一个房间与多个预订相关联不要在Room 实体中创建预订类型。

    【讨论】:

    • 谢谢,很有用!所以如果我要在我的Reservation 中添加一个Room 导航属性,我还必须添加一个[ForeignKey(nameof(Room))] string RoomId,对吧?
    • 完全可以添加,但不是必需的。 Room 属性就足够了。如果您不添加 RoomId,EF Core 将在您的数据库中创建一个默认的 FK 名称 Room_Id,但您将无法在您的 C# 中使用它。在我这边,我总是在我的数据库中添加一个代表我的 FK 的属性。所以是的,添加该属性 RoomId。
    【解决方案2】:

    我认为,您应该有一个新的实体 HotelRoom,其中包含 Hotel 和 Room,Hotel 和 Room 之间的多对多关系。然后,对于每个 Reservation,您应该在其中包含 Hotel 和 HotelRoom 列表。

    public class Hotel
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    public class Room
    {
        public int Id { get; set; }
        public int RoomNumber { get; set; }
    }
    public class HotelRoom
    {
        public int HotelId { get; set; }
        public Hotel Hotel { get; set; }
        public int RoomId { get; set; }
        public Room Room { get; set; }
    }
    
    public class Reservation
    {
        public int Id { get; set; }
        public int HotelId { get; set; }
        public Hotel Hotel { get; set; }
        public List<HotelRoom> HotelRooms { get; set; }
    }
    

    【讨论】:

    • 我知道你在说什么,但它不适用于这里。这不像我正在处理可以包含在多个播放列表中的视频。一个酒店可以有多个房间,但一个房间只属于一个酒店(一对多)。
    • 你是对的,如果只有一家酒店,它可以工作,但如果有多个酒店,那么上面的模型就可以了。如果您与一家酒店合作,那没关系。祝你好运。
    • 我与多家酒店合作,但多对多不是这里的方式。这意味着一个房间可以存在于多个酒店中,这是不可能的(至少在现实世界中是这样)。
    • 那么您需要为每个酒店提供不同的 Room 表。对吗?
    • 不,兄弟...Hotel 实体包含集合导航属性 (List&lt;Room&gt;); Room 实体包含一个 Hotel 导航属性和一个外键 HotelId。这就是使用 EF Core 定义一对多关系的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    相关资源
    最近更新 更多