【发布时间】:2021-03-26 20:30:42
【问题描述】:
我在弄清楚如何正确建模我的领域中的多对多关系时遇到一些问题,即围绕领域对象始终处于活动状态这一事实。
所以这里讨论的模型围绕两个对象:事件和库存。一个事件可以有多个分配给它的库存项目(想想椅子、盘子、叉子等),一个库存项目可以分配给多个事件。当我们将它分配给一个事件时,我们定义了我们想要分配给该事件的所述项目的数量。然而,这就是问题出现的地方,因为领域对象始终处于活动状态并且对象类型相同,所以无论事件有什么数据都会影响我的库存数据行。
总体情况是,当我进入库存详细信息视图时,我想显示为每个即将发生的事件分配了多少物品。例如,我可能总共有 50 个椅子,我已经为明天的活动分配了 40 个,这意味着如果有人试图安排当天的活动,我不能再分配 20 个。
我的 Realm 对象如下所示:
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; }
}
然后我尝试在我的虚拟机中做我想做的事情(即显示为该事件分配了多少项目):
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 更熟悉
【问题讨论】:
-
我能够解决这个问题,而不是在我的领域中尝试多对多,我只是查询我的事件表,而不是拥有 IList of Inventory,而是在我模仿库存的领域数据库。因此,Inventory 无法看到它与多个事件相关的事实。看起来很老套,处理这个问题的方法不正确
-
实际问题不是很清楚。如果您的目标是显示为每个即将到来的事件分配了多少项目,您将在每个事件中使用
public IList<Inventory> Items { get; }的计数。如果您想查看周六的活动是否需要多少椅子,请查询这些活动并获取项目的总和。 -
所以我可能没有解释得太清楚,但是作为一个整体的问题是如何在 Realm 中正确地建模 M 到 M 关系而不影响实际的子组件。例如:假设我有一个计数为 40 的项目,并且事件说只有 20 个被分配给该项目,因为它们是同一个对象,该事件具有的集合将覆盖领域中的单个项目本身
-
Realm 不是这样工作的。如果您有一个包含 20 把椅子列表的事件,则对椅子本身没有影响,因为它是对每把椅子的指针或引用。椅子不知道该事件并且椅子不是同一个对象;它们是 20 个不同的椅子对象,没有任何内容被覆盖。如果您随后为每把椅子添加反向关系,则它是对椅子所属的 events(复数)的引用。在这种情况下,当您将椅子添加到事件中时,会自动创建一个反向关系并将其添加到椅子上,这样它就会知道它所属的事件。
-
可以应用一个过滤器,根据列表中与该过滤器匹配的项目数返回计数。假设有 20 把椅子和 12 张桌子的活动。您的
IList<Inventory> Items将包含总共 32 个库存项目,您可以直接过滤这些项目的数量。一般 - 类似于numChairsForThisEvent = someEvent.Items.filter("name == 'chair'").count。这将返回 20 的计数。您可以将该数字与椅子的总数(来自 Inventory 对象)进行比较。此外,您还可以获得即将举行的活动总共需要多少把椅子。
标签: c# xamarin.forms realm