【问题标题】:Entity Framework - Inheritance实体框架 - 继承
【发布时间】:2010-10-07 03:22:23
【问题描述】:

我刚开始使用Entity Framework,遇到以下问题:

我有一个 Site 实体,其中包含一个导航属性 Paragraphs

我有多个实体(即 ImageParagraphLinkListParagraph)应该从 Paragraph 继承。

我想查询一个 Site 对象并访问它的 Paragraphs 并根据它们的具体类型使用它们(即 ImageParagraphLinkListParagraph)。

它可以使用按层次结构表的方法(有条件),但是我最终会得到一个非常肮脏的解决方案。根据段落 ID 查询具体类型是可行的,但我希望有更好的解决方案。

我想查询 Site 并显示一些特定于站点的数据和段落中的数据(ImageParagraphLinkListParagraph)。我不知道如何设置映射,以便可以直接通过 Paragraphs 导航属性检索 ImageParagraphLinkListParagraph 对象.

你会如何解决这个问题?

ER-图:http://img443.imageshack.us/img443/46/69863714ks0.jpg

alt text http://img443.imageshack.us/img443/46/69863714ks0.jpg

【问题讨论】:

    标签: .net database entity-framework


    【解决方案1】:

    如果你想基于基于它们的具体类型来使用它们——这听起来像是多态性的一个例子......你可以(在部分类中)添加一些方法吗?

    partial class Paragraph {
        public abstract void Foo();
    }
    partial class ImageParagraph {
        public override void Foo() {/*code*/}
    }
    partial class LinkListParagraph {
        public override void Foo() {/*code*/}
    }
    

    否则,如果要过滤集合,可以使用OfType扩展方法-即

    foreach(var imgPara in obj.Paragraphs.OfType<ImageParagraph>())
    { ... }
    

    也许您也可以为上述添加属性(在父对象中) - 即

    partial class Site {
        public IQueryable<ImageParagraph> ImageParagraphs
        { get {return Paragraphs.OfType<ImageParagraph>(); }}
    
        public IQueryable<LinkListParagraph> LinkListParagraphs
        { get {return Paragraphs.OfType<LinkListParagraph>(); }}
    }
    

    【讨论】:

    • 谢谢。我的问题不清楚。我想做: var site =context.Site.Include("Paragraphs").Where(c => c.SiteID == 1).First() ; foreach(站点中的var段落。段落){做某事};我的问题是我不知道 EDM 中的映射。(比如每个层次结构的表和条件)
    猜你喜欢
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2011-05-18
    • 2013-04-21
    相关资源
    最近更新 更多