Не удается заставить EF4 активно загружать подклассы для работы - PullRequest
0 голосов
/ 03 сентября 2010

У меня есть абстрактная сущность Content в моей модели EF4 с конкретным подклассом, MultipleChoiceItem.В случае MultipleChoiceItem есть связанная таблица, к которой обращается свойство Navigation в объекте MultipleChoiceItem, называемое 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.Count == 0, когда должно быть 4 (проверено проверкой основного хранилища данных).

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

Может кто-нибудь сказать мне, что я делаю неправильно?Я пытался следить за моделями, которые я видел опубликованные и, по-видимому, что-то упустил ...

Спасибо!

1 Ответ

0 голосов
/ 07 сентября 2010

Мой атрибут типа метаданных для метаданных, которые я должен был сделать вручную (поскольку RIA по какой-то причине не создает метаданные для подклассов по умолчанию), имел неправильный тип. Это непреднамеренно читается:

[MetadataTypeAttribute(typeof(MultipleChoiceItem.ContentMetadata))]

И должен был прочитать:

[MetadataTypeAttribute(typeof(MultipleChoiceItem.MultipleChoiceMetadata))] 

Тот факт, что метаданные для подклассов не генерируются, весьма раздражает.

Как бы то ни было, публикуйте здесь, если у кого-то еще есть эта проблема!

...