Realm.io 多对多

Realm.io Many-to-Many

我在弄清楚如何正确地为我的领域中的多对多关系建模时遇到了一些问题,即围绕领域对象始终存在的事实。

所以这里讨论的模型围绕两个对象:Event 和 Inventory。一个事件可以分配多个库存项目(比如椅子、盘子、叉子等),一个库存项目可以分配给多个事件。当我们将它分配给一个事件时,我们定义了我们想要分配给该事件的所述项目的数量。然而,这就是问题所在,因为领域对象总是存在的并且对象类型是相同的,无论事件有什么数据也会影响我的库存数据行。

总的来说,当我进入库存详细信息视图时,我想显示为每个即将发生的事件分配了多少项目。因此,例如,我可能总共有 50 把椅子,我已经为明天的活动分配了 40 把,这意味着如果有人也试图在当天安排活动,我就不能再分配 20 把。

我的领域对象如下所示:

public class Event : RealmObject
{
    [PrimaryKey]
    public string EventId { get; set; } 
    [Indexed]
    public string VenueId { get; set; }
    [Indexed]
    public string Name { get; set; }
    public DateTimeOffset DateOfEventUTC { get; set; }
    public IList<Inventory> Items { get; }
}

public class Inventory : RealmObject
    {
        [PrimaryKey]
        public string InventoryId { get; set; }
        [Indexed]
        public string VenueId { get; set; }
        public Category Category { get; set; }
        public int Count { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        [Backlink(nameof(Event.Items))]
        public IQueryable<Event> Events { get; }
    }

然后我尝试在我的 VM 中做我想做的事情(即显示为该事件分配了多少项目):

var item = unitOfWork.InventoryRepository.GetById(inventoryId);
            var nextMonth = DateTime.UtcNow.AddMonths(1);
            AssignedEvents = item.Events
                .Where(x => x.DateOfEventUTC >= DateTime.UtcNow && x.DateOfEventUTC <= nextMonth)
                .ToList()
                .Select(x => new AssignedEventModel
                {
                    DateOfEventUTC = x.DateOfEventUTC.DateTime,
                    Name = x.Name,
                    AssignedItems = x.Items.First(z => z.InventoryId == inventoryId).Count
                })
                .ToList();

不幸的是,这就是问题所在。我尝试按照领域文档中的建议应用 [Ignored] 标签,这样该项目将不再保留。不幸的是,这并没有解决我的问题。我对领域还是个新手,我对 SQL 比 NoSQL

熟悉得多

我也很难弄清楚这在 SQL 中是如何工作的,但我不是这方面的专家,所以我可能会遗漏一些细节,这些细节将允许它以您构建它的方式工作。 回到我们的案例:问题与 Realm 的运行无关,而更多地与您构建域模型的方式有关。 如果您使用相同的“库存”模型来做两件事:

  1. 跟踪每个项目的总金额
  2. 跟踪特定事件中使用的每个库存项目的数量

您会对 Count 的真正含义产生疑问。 创建第三个模型将解决您所有的问题。

  1. 库存 => 一件物品的总量
  2. 事件 => 表示事件及其所有数据
  3. EventInventory => 表示该事件中使用的物品数量

没有太多关于您的项目和其他模型的信息(请参阅 AssignedEventModel 等)我可以按照这些建议提出一些建议

class Event : RealmObject
{
    [PrimaryKey]
    public string EventId { get; set; }

    // ... other fields you need ...

    public DateTimeOffset DateOfEventUTC { get; set; }

    [Backlink(nameof(EventInventory.Event))]
    public IList<EventInventory> Items { get; }
}

class EventInventory : RealmObject
{
    public Inventory Inventory { get; set; }

    public int Count { get; set; }

    public Event Event { get; set; }
}

class Inventory : RealmObject
{
    [PrimaryKey]
    public string InventoryId { get; set; }

    // ... other fields you need ...
    
    public int TotalCount { get; set; }

    [Backlink(nameof(EventInventory.Inventory))]
    public IQueryable<EventInventory> EventInventories { get; }
}

然后在您库存的 VM 中

var inventory = unitOfWork.InventoryRepository.GetById(inventoryId);
var inUse = inventory.EventInventories
    .Where(x => /*...*/)
    .Sum(x => x.Count);

// your databind count that want to show under Inventory's View
remainingCount = inventory.TotalCount - InUseCount;

所以基本上,现在您可以计算在特定时间范围内特定 InventoryItem 的剩余可用量。使用这些模型,如果需要,您应该能够创建 AssignedEventModel。 希望对您有所帮助。

在侧节点上,我注意到您正在使用 unitOfWork 和存储库模式(至少,看起来如此)。尽管它看起来是个好主意,但在使用 Realm 时通常不鼓励使用它。这仅仅是因为您将错过 Realm 的一些强大功能。 您可以在答案的“存储库”部分阅读有关此 的更多信息。