如何在 C# 中无异常地建模对象关系

How to model object relationships without anomalies in C#

所以,这不是一个超级容易描述的问题,因为它本质上有点概念性,但这里有:

我正在构建一个 C# WPF 应用程序来管理电影制作和调度。我使用的是模型-视图-视图模型设计,我的问题仅与模型有关。我会尽量将其排除在问题域之外,但我必须稍微解释一下。

所以基本上,该程序具有"ShootingDays"、"Scenes"、"Shots" 和"FilmTasks" 的概念(类)。您可以定义计划拍摄的日期 ("ShootingDays")、场景的详细信息 ("Scenes") 以及该场景中的镜头 ("Shots")。然后,在 "ShootingDay" 内,您可以创建当天的日程安排,其中包括 "FilmTasks" 个单独的议程项目。这些 "FilmTasks" 可以是一般任务(IE Arrive to location),也可以是特定场景。 "FilmTasks" 中的 "Scenes" 也包含场景中的 "Shots"。

总结:

项目有拍摄日和场景

A Shooting Day 有 FilmTasks

一个场景有镜头

一个 FilmTask 有一个场景或 none

当我第一次处理这个问题时,我认为这作为关系数据库非常有意义。给每个对象一个唯一的标识符和它们所属对象的标识符。简单的加入,我很好。但我不是在制作 Web 应用程序,而是在桌面上读取 XML 个文件。所以我的第一个尝试是,我只是通过从静态方法中为所有内容提供唯一 ID 来模拟关系 table,该方法总是 return 一个不同的整数。我根据这些做了我的 "joins",但它看起来超级混乱,特别是在序列化项目时,这意味着序列化最后一个唯一整数 returned,所以我可以从那里继续。

所以当我面对这个问题时,我决定将所有内容重构为一个更简单的层次结构,其中 Scenes 有一个 Shot 对象列表而不是一个整数列表来执行 "joins" 和其他关系以同样的方式。但是现在我面临更新异常,例如在将场景添加到 FilmTask 后从场景中添加或删除镜头,FilmTask 中的 Scene 对象不会更改。我可以手动更改所有这些,搜索所有任务以找到相关任务,但这看起来也非常混乱。

我希望这不会太混乱。基本上我觉得我采用的两种方法都不是最优的,我正在寻找清理方法。我可以在这里做什么?如果需要任何说明,我可以提供。

关系模型和对象模型根本不兼容。这个问题被称为对象关系阻抗不匹配,如果您想阅读该主题。

如果您需要同时生成关系数据库和面向对象的程序,您应该做与开始时差不多的事情 - 从概念开始,然后勾勒出模型。对于您需要的两种模型,这是一个很好的起点。之后,他们将发生分歧——使用相同的概念模型为数据库生成一个(规范化的、关系的)模型,并为 OO 程序生成一个单独的 class 模型。

听起来您已经开始在事物的 OO 方面走上正确的道路 - 而不是试图复制关系模型,您让一个对象容纳一个装满其他对象的容器。我不认为你遇到的问题与你的结构有关,而是一个更技术性的问题 - 听起来 Scene 持有你的 Shot 对象的 copy 而不是引用给他们。如果您获取一个对象的副本,那么无论原始对象发生什么情况,该副本将继续查看它在复制时的样子。

从概念上讲,保存对对象的引用与您最初尝试对 ID 执行的操作更加相似。但是,在代码中,持有副本或持有参考看起来 非常 相似 - 阅读此内容 (here's a related question you might find useful),看看你是如何通过的Shot 对象到 Scene 对象。如果在那之后您仍然遇到困难,请编辑您的问题并包含发生这种情况的代码。

回到对象与关系的问题上来,如果您在某个时候确实需要关系数据库和 OO 程序,那么您需要在它们之间进行某种对象-关系映射。您可能会考虑处理此转换的 classes 层。您可以使用像 Entity Framework 这样的 ORM 工具,让 Microsoft 来完成艰苦的工作,但如果您正在学习,那么根据我的经验,花时间和精力去了解如何为自己做这件事是非常值得的,而且它让您完全控制这两种结构。

如果我在任何方面误解了你,请给我评论,我很乐意重温。