如何在没有C#异常的情况下建模对象关系

时间:2015-05-25 12:58:35

标签: c# oop relational-database

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

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

所以基本上,该程序有" ShootingDays"," Scenes"," Shots"和" FilmTasks&#34的概念(类) ;。您可以定义拍摄时的日期(" ShootingDays"),场景的详细信息("场景")以及场景中的镜头("镜头") 。然后,在" ShootingDay"中,您可以创建当天的日程安排,包括" FilmTasks",个别议程项目。这些" FilmTasks"可以是一般任务(IE到达位置),也可以是特定场景。那些"场景"在" FilmTasks"然后还包含" Shots"在场景中。

总结:

该项目有拍摄日和场景

射击日有FilmTasks

场景有镜头

FilmTask有一个场景或没有场景

当我第一次遇到这个问题时,我认为这作为一个关系数据库很有意义。为每个对象提供其所属对象的唯一标识符和标识符。简单的加入,我很好。但我没有制作网络应用程序,而是从桌面上的XML文件中读取数据。所以我第一次看到这个,我只是通过给静态方法提供一个唯一的ID来模拟一个关系表,该方法总是返回一个不同的整数。我做了我的"加入"基于这些,但它似乎超级凌乱,特别是在序列化项目时,这意味着序列化返回的最后一个唯一整数,所以我可以从那里继续。

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

我希望这不会让人感到困惑。基本上我觉得我采取的两种方法都是次优的,而且我希望能够清理一下。我能在这做什么?如果需要澄清,我可以提供。

1 个答案:

答案 0 :(得分:1)

关系模型和对象模型从根本上是不兼容的。如果您想阅读该主题,则此问题称为对象关系阻抗不匹配。

如果您需要同时生成关系数据库和面向对象的程序,那么您应该完成您的工作 - 从概念开始,并勾画出模型。对于您需要的两种型号而言,这是一个很好的起点。之后,他们会分歧 - 使用相同的概念模型为数据库生成一个(规范化的,关系型)模型,并为OO程序生成一个单独的类模型。

听起来你开始采用OO方面的正确方式 - 而不是试图复制关系模型,你有一个对象持有一个装满其他对象的容器。我不认为你遇到的问题是你的结构问题,而是一个更技术性的问题 - 听起来好像Scene正在拿着你的Shot对象的副本而不是引用他们。如果您获取一个对象的副本,那么无论原始对象发生什么情况,该副本将继续在复制点处继续显示。

从概念上讲,持有对象的引用将与您最初尝试使用ID做的更相似。但是,在代码中,持有副本或持有引用可以看起来非常类似非常 - 阅读此内容(here's a related question you might find useful),并了解您如何通过将对象拍摄到Scene对象。如果您在此之后仍然陷入困境,请编辑您的问题并将代码包括在内。

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

如果我在任何一点上误解你,请给我发表评论,我很乐意重新审视这一点。