无法让EF4渴望加载子类实体

时间:2010-09-03 13:24:06

标签: .net entity-framework-4 wcf-ria-services eager-loading domainservices

我的EF4模型中有一个抽象的Content实体,带有一个具体的子类MultipleChoiceItem。在MultipleChoiceItem的情况下,有一个相关的表由MultipleChoiceItem实体上的Navigation属性访问,名为Options。我想急切加载Options结果,因为如果你得到一个MultipleChoiceItem,你总是想要选项。但是,我似乎无法让这个工作。以下是我的基本工作:

  • MultipleChoiceItem是一个子类,因此默认情况下不会创建元数据。所以,我为它创建了一个类似于它的元数据类:

    [MetadataTypeAttribute(typeof(MultipleChoiceItem.ContentMetadata))]
    public partial class MultipleChoiceItem
    {
        internal sealed class MultipleChoiceItemMetadata
        {
            ... other stuff ... 
            [Include]  
            public EntityCollection<McOption> Options { get; set; }
            ... other stuff ...
        }
    
  • 然后我在ContentService中创建了一个如下所示的新查询:

    public IQueryable<Content> GetMultipleChoiceItems()  
    {  
        return this.ObjectContext.Contents.OfType<MultipleChoiceItem>()
            .Include("Options");  
    }
    

在单元测试中,我这样称呼:

    context = new ContentContext();
    var loadOperation = context.Load(context.GetMultipleChoiceItemsQuery());
    loadOperation.Completed += new EventHandler(CompletedHandler);

一旦我进入CompletedHandler,下面的代码似乎没有加载Options属性 - 实际上,当它应该是4时,Options.Count == 0(通过检查底层数据存储来验证)。 / p>

    MultipleChoiceItem mci = context.Contents.First(c => c.ContentId == mciId) as MultipleChoiceItem;

谁能告诉我我做错了什么?我试图按照我见过的模型,显然错过了一些东西......

谢谢!

1 个答案:

答案 0 :(得分:0)

我必须手工完成的元数据的元数据类型属性(因为RIA由于某种原因默认不为子类创建元数据)具有错误的类型。它无意中读到:

[MetadataTypeAttribute(typeof(MultipleChoiceItem.ContentMetadata))]

应该读过:

[MetadataTypeAttribute(typeof(MultipleChoiceItem.MultipleChoiceMetadata))] 

没有为子类生成元数据的事实非常烦人。

无论如何,发布此处以防其他人有此问题!