【问题标题】:LINQ to SQL inheritance questionLINQ to SQL 继承问题
【发布时间】:2009-06-22 23:19:26
【问题描述】:

我正在进行以下测试,以尝试了解有关 LINQ to SQL 的更多信息。

我有一个包含 activityId、parentId、类型的活动表。

类型用作鉴别器值,表示它是活动、任务还是项目。

我有一个继承自 Activity 的 Activity、Task 和 Project 类,Task 从 Project 语义上继承似乎是错误的,但为了减少冗余数据,这似乎是一种更好的方法,我可以更改该类的名称或将它们分开。

Activity 类没有 parentId 属性,但 Task 类将使用 parentId 作为 projectId 关联到 Project 类。

我附上了表格和我的 dbml 以及类图的屏幕截图,你可以从类图中看到它只是一个更简单的实现我没有子活动、跨 diff 项目的任务等。我我也忽略了这个系统的用户端,因为它只是一个原型。所以忽略管理器类,我不会使用角色。我只使用硬编码的测试用户。

我有一份我想问的事情的清单。 1. 我的任务都需要一个 projectId,因为这是活动类的 parentID。这个设置如何与 Project 类一起使用?如您所见,目前它们之间没有关联。我应该为 Project 创建一个属性吗?当 ActivityId 可能也是 Project 类的 projectID 时,它是如何工作的?

    1234563活动?
  1. 你还可以看到一个项目活动,抱歉这个类也应该继承自 Activity 类,我在上传图片时错过了这个。这是用于里程碑之类的事情,没有相关时间或用户的活动仍然应该有相关项目。

有人对我想要实现的目标有任何想法吗?我在这一切上走得太远了吗?感谢您的帮助 :) 抱歉,如果没有足够的细节,我试图保持简短,而没有进入我为此测试系统考虑的业务需求的完整列表。

编辑:我确定只是说明显而易见,但请复制图像位置以便更好地查看。

alt text http://img134.imageshack.us/img134/1199/tmss.jpg

【问题讨论】:

    标签: linq-to-sql inheritance


    【解决方案1】:

    您的活动类只是将不同类型的活动收集在一起的一种方式。为了防止它污染您的架构的其余部分,我会将它与您的其他类分开。这将使您的思想解放出来,专注于项目、任务和报告在架构结构中的自身优点。

    一旦你弄清楚了,你就可以返回并添加你的活动类。如果您愿意,可以将其称为“跨领域”关注点。它在表级别看起来像这样:

    Table:  Activities
    Fields:    ActivityID       PK Int Identity
               ActivityType     Int  <-- tells you the originating table
               OriginatingID    Int  <-- from the PK of the originating table
               Description      ..etc.
    

    时间跟踪有自己的表/类。

    您可能想知道,如何在我的活动类和设计器中的其他类之间画线。你没有。您可以根据需要使用 Linq 对其他表/类进行临时连接。

    如果您使用存储库模式,您可以在存储库中包含代码,当调用者更新项目、任务、报告等时,自动添加或更新活动类中的记录。

    【讨论】:

    • 我认为我必须使用 Activity 类,以便 Task 和 Project 可以继承一些东西,并且在 Activities 表中有一个相关的鉴别器属性,Task 和 Project 通过它们的父类使用?另外我不明白上述内容将如何帮助将任务与项目和项目与活动联系起来?有没有办法可以在项目类中显示继承的属性,以便可以使用项目类中的活动 ID 将其与任务项目 ID 相关联??
    • 我习惯于在餐桌层面考虑这些事情。我理解拥有相关鉴别器属性的愿望,因为 Activity 可以是任何东西。您可以通过在任务中使用 ProjectID 将任务链接到项目。活动已通过 OriginatingID 链接到项目
    【解决方案2】:

    我想出了一个解决方案,使用上面显示的 LINQ to SQL 的实体图。

    我创建了一个活动、任务、项目和项目活动继承自的基本活动抽象类。

    此外,实体图似乎要求您向继承的类添加属性,以便能够将它们用于类之间的关联。所以最后我就这样做了,并将基础活动类中的原始 activityId 设为私有属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 2012-05-29
      • 2010-09-09
      • 1970-01-01
      • 2012-03-24
      • 2011-07-31
      • 1970-01-01
      相关资源
      最近更新 更多