【问题标题】:Is it possible to combine two entities with different PKs?是否可以将两个具有不同 PK 的实体结合起来?
【发布时间】:2010-02-05 15:21:03
【问题描述】:

我是实体框架的新手,所以希望这是一个非常简单的问题...我可以将这两个实体结合起来吗?

alt text http://img215.imageshack.us/img215/9684/entz.jpg

这里是数据库... alt text http://img697.imageshack.us/img697/851/52477698.jpg

我希望决赛是这样的...... alt text http://img694.imageshack.us/img694/88/entss.jpg

【问题讨论】:

  • 合并如何?把它们变成一个单一的实体类型?不清楚你想在这里做什么。你能画出你想看到的结果吗?
  • 很抱歉。我会尝试清除它...我希望relatedResource 实体具有类型名和来自resourcetype 实体的图标属性,以便我可以使relatedResources 成为抽象实体并为从相关资源继承的每种类型创建不同的实体。我目前不能这样做,因为)如果我理解正确)框架不支持对同一实体的继承和包含。

标签: .net entity-framework


【解决方案1】:

我认为您是在问,“我不能将相关实体用作表每个层次结构继承的鉴别器字段,这是真的吗?”这是正确的。您需要一个单独的鉴别器字段来使用每个层次结构继承的表。但是,在这种情况下,您可能不需要 ResourceType 实体,因为实体本身的特定类型足以告诉您使用哪个图标。

但是,我想在这里质疑继承是否是正确的设计。

在 O/R 映射中使用继承总是有点折衷,因为您要么使用类似于按层次结构表的设计,它不会自然映射到格式良好的关系模式,要么使用类似于按类型的表设计,这意味着数据库服务器必须更加努力地提供即使是简单的列表。我认为“Favor composition over inheritance”的通用设计指南尤其适用于 O/R 映射,而不是一般的 OOD。

我了解您添加的图片只是说明您的问题的示例,您的实际设计可能会更复杂,但我们以它为例:

图中的子类型(Application、File 等)只有一个属性不在父类型中。对于许多子类型,“额外”属性是相同的,Link。其中一个具有不同的属性 (Filename),但我会注意到文件名可以表示为 URI。

除了您在插图中展示的继承设计之外,您还可以在不使用继承的情况下对该设计进行建模。在这种情况下,您将删除子类型,但保留 ResourceType 实体。

现在让我们考虑一些示例查询在每种设计中可能是什么样子:

// get books with inheritance:
var bi = from b in Context.RelatedResources.OfType<Book>()
         select b;

// without
var bc = from b in Context.Resources
         where b.ResourceType.ID == ResourceType.Book // static property you define on ResourceType 
         select b;

没有一个让我觉得非常糟糕。对我来说,这就是不使用继承的充分理由。在 O/R 映射中继承最引人注目的优势是能够在单个列表中轻松检索不同子类型的实体。但是你已经可以用这个设计做到这一点。因为组合设计更容易实现、不太复杂,并且会更有效地使用您的数据库,所以我更喜欢它,除非继承具有引人注目的优势,我在这里看不到。

【讨论】:

  • 宾果游戏!谢谢克雷格,这正是我的意思。在这种情况下,我想我会和继承说再见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
相关资源
最近更新 更多