代码之家  ›  专栏  ›  技术社区  ›  Mike Florian Doyen

是否可以将两个实体与不同的pk组合在一起?

  •  0
  • Mike Florian Doyen  · 技术社区  · 15 年前

    我刚接触实体框架,所以希望这是一个非常简单的问题…我能把这两个实体结合起来吗?

    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

    1 回复  |  直到 15 年前
        1
  •  1
  •   Craig Stuntz    15 年前

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

    然而,我会质疑继承是否是这里的正确设计。

    在O/R映射中使用继承总是有点折衷的,因为您要么使用一个类似于设计的每层次表(table-per-hierarchy),它不能自然地映射到一个格式良好的关系模式,要么使用类似于设计的每类型表(table-per-type),这意味着DB服务器必须更加努力地提供一个简单的列表。我认为通用设计指南 Favor composition over inheritance “对于O/R映射,尤其是对于ood,更是如此。

    我知道您添加的图片只是一些例子来说明您的问题,您的实际设计可能更复杂,但让我们以它为例:

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

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

    现在,让我们考虑一些示例查询在每个设计中的外观:

    // 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映射中继承的最引人注目的优点是能够在单个列表中轻松地检索不同子类型的实体。但是你已经可以用这个设计来做了。因为组合设计更容易实现,也不那么复杂,并且可以更高效地使用数据库,所以我更喜欢它,除非继承有一个引人注目的优势,我在这里没有看到这一点。