Cosmos DB 重复子项为空

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

我有一个 HotelConference 对象,其中包含事件集合。

每个事件都有一个事件位置。

活动可以在同一地点举行,因为 BallRoomA 中可能举办两个活动。

当我添加一个具有已分配给先前事件的 EventLocation 的事件时,第一个 Event.EventLocation 为 null。

这是我正在使用的库

<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="9.0.0-preview.6.24328.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Cosmos" Version="9.0.0-preview.6.24327.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.0-preview.6.24327.4">

这是课程

public class Conference : CosmosBase
{
    public Hotel Hotel { get; set; }
    public ICollection<Event> Events { get; set; } = new List<Event>();
    public string ConferenceName { get; set; }
}
public class Event : CosmosBase
{
    public Conference Conference { get; set; }
    public EventLocation EventLocation { get; set; }
    public string EventName { get; set; }
}
public class EventLocation : CosmosBase
{
    public Hotel Hotel { get; set; }
    public string EventLocationName { get; set; }
}

这是种子代码

List<Event> CreateEvents(Hotel h, Conference c, List<EventLocation> locs)
{
    var e0 = new Event();
    e0.PK = h.PK;
    e0.ID = e0.GetNewID();
    e0.Conference = c;
    e0.EventName = "Conference Check In";
    e0.EventLocation = locs[0];

    var e1 = new Event();
    e1.PK = h.PK;
    e1.ID = e1.GetNewID();
    e1.Conference = c;
    e1.EventName = "Keynote Session";
    e1.EventLocation = locs[0];

    var events = new List<Event>();
    events.Add(e0);
    events.Add(e1);
    return events;
}

事件 e0.EventLocation 为空。 eventlocation 显然有相同的 id,但这应该不是问题,但我怀疑是这样。

这是 Cosmos db 中生成的 json

{
    "ID": "2516807109275195800",
    "PK": "H-0d5fdf24-845b-4d0b-b92b-1e48979f69aa",
    "ConferenceDescription": "All hotels conference",
    "ConferenceEndDate": "2024-10-10T15:00:00-05:00",
    "ConferenceName": "The Big Conference",
    "ConferenceStartDate": "2024-10-07T09:30:00-05:00",
    "Discriminator": "Conference",
    "HotelID": "2516807109275205674",
    "HotelPK": "H-0d5fdf24-845b-4d0b-b92b-1e48979f69aa",
    "id": "Conference|2516807109275195800",
    "Events": [
        {
            "ID": "2516807109275185830",
            "EventDescription": "Check in to conference",
            "EventEndDate": "2024-10-07T15:30:00-05:00",
            "EventName": "Conference Check In",
            "EventStartDate": "2024-10-07T06:00:00-05:00",
            "PK": "H-0d5fdf24-845b-4d0b-b92b-1e48979f69aa",
            "EventLocation": null
        },
        {
            "ID": "2516807109275183758",
            "EventDescription": "Where the keynote speakers talk",
            "EventEndDate": "2024-10-07T10:30:00-05:00",
            "EventName": "Keynote Session",
            "EventStartDate": "2024-10-07T09:00:00-05:00",
            "PK": "H-0d5fdf24-845b-4d0b-b92b-1e48979f69aa",
            "EventLocation": {
                "EventLocationDescription": "The biggest ballroom we have",
                "EventLocationName": "Grand Ballroom",
                "HotelID": "2516807109275205674",
                "HotelPK": "H-0d5fdf24-845b-4d0b-b92b-1e48979f69aa",
                "ID": "2516807109275190703",
                "PK": "H-0d5fdf24-845b-4d0b-b92b-1e48979f69aa"
            }
        },
c# .net azure entity-framework-core azure-cosmosdb
1个回答
0
投票

我认为您的模式有些混乱,它可能将事件和事件位置之间的关系视为一对一而不是多对一。我没有看到您的事件表中引用了 EventLocationId,这是多对一允许事件共享位置所需要的。相反,如果架构将 EventId 放在您的 EventLocation 上,那么该位置将最终出现在您与之关联的最后一个事件上。

另外,PK 列与 ID 列的意义是什么?这看起来相当令人困惑,因为事件和事件位置共享相同的“PK”值。 “PK”通常被推断为“主键”,它与“ID”列同义,通常标记为 PK。

© www.soinside.com 2019 - 2024. All rights reserved.