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

本文关键字:建模 对象 关系 异常 | 更新日期: 2023-09-27 17:50:44

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

我正在构建一个c# WPF应用程序来管理电影制作和调度。我使用的是模型-视图-视图模型设计,我的问题完全与模型有关。我会尽量把它排除在问题范围之外,但我必须解释一下。

所以基本上,该程序有"拍摄日","场景","镜头"answers"电影任务"的概念(类)。你定义你计划拍摄的日子("拍摄日"),场景的细节("场景"),以及场景中的镜头("镜头")。然后,在"拍摄日"中,你可以为当天创建一个时间表,其中包括"电影任务",个人议程项目。这些"电影任务"可以是一般的任务(比如到达某个地点),也可以是特定的场景。"FilmTasks"中的那些"Scenes"也包含场景中的"Shots"。

总结:

项目有拍摄日期和场景

A Shooting Day has FilmTasks

一个场景有镜头

一个电影任务有一个场景或没有

当我第一次处理这个问题时,我认为这对于关系数据库来说是非常有意义的。给每个对象一个唯一的标识符和它们所属的对象的标识符。简单连接,没问题。但我不是在制作web应用程序,我是在读取桌面的XML文件。首先,我模拟了一个关系表,通过静态方法给所有东西一个唯一的ID,该方法总是返回一个不同的整数。我基于这些进行了"连接",但它看起来非常混乱,特别是在序列化项目时,这意味着序列化最后返回的唯一整数,所以我可以从那里继续。

所以当我面对这个问题时,我决定将所有内容重构为一个更简单的层次结构,其中场景有一个Shot对象列表,而不是一个整数列表来进行"连接",并以同样的方式处理其他关系。但现在我面临更新异常,例如添加或删除镜头从一个场景后,它已被添加到一个电影任务,电影任务内的场景对象不会改变。我可以手动更改它们,在所有任务中搜索以找到相关的任务,但这似乎也超级混乱。

我希望这不会让你太困惑。基本上,我觉得我所采取的两种方法都不是最优的,我想要把事情清理干净。我在这里能做什么?如果需要澄清,我可以提供。

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

关系模型和对象模型从根本上是不兼容的。这个问题被称为对象-关系阻抗不匹配,如果您想深入了解这个主题的话。

如果你需要创建一个关系数据库和一个面向对象的程序,你应该做你开始做的事情——从概念开始,然后勾勒出一个模型。对于需要的两个模型来说,这是一个很好的起点。在那之后,它们将分道扬镳——使用相同的概念模型为数据库生成一个(规范化的关系)模型,为OO程序生成一个单独的类模型。

听起来你已经开始在OO方面走正确的路了——而不是试图复制关系模型,你让一个对象容纳一个充满其他对象的容器。我不认为你的问题是与你的结构,但一个更技术性的问题-这听起来像场景持有的副本你的镜头对象,而不是对他们的引用。如果你复制了一个对象,那么无论原始对象发生了什么,该副本将继续保持它在复制时的样子。

从概念上讲,持有对象的引用将更类似于您最初尝试对id所做的事情。然而,在代码中,持有副本或持有引用可以看非常相似-阅读这一点(这里是一个相关的问题,你可能会发现有用的),并看看你是如何传递镜头对象到场景对象。如果你在这之后仍然卡住了,编辑你的问题,并包括发生这种情况的代码。

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

如果我在任何一点上误解了你,请给我评论,我很乐意重新讨论这个问题。