В EF 4.1 код первого: один-ко-многим проблема сопоставления


В моем домене у меня есть эти классы (в упрощенной форме)

    public class Document
    {    
        public string Id { get; set; }
        public IList<MetadataValue> MetadataList { get; set; }
    }

    public class MetadataValue
    {
        public string DocumentId { get; set; }
        public string Metadata { get; set; }
        public string Value { get; set; }
    }

Документ может иметь много метаданных. В отображении сущности документа у меня есть:

    HasMany<MetadataValue>(x => x.MetadataList)
        .WithRequired()
        .HasForeignKey(x => x.DocumentId);

Когда я сохраняю объект документа, его список метаданных также сохраняется. Но когда я получаю объект Document, его список метаданных всегда равен нулю. Что не так с этим отображением?

3 4

3 ответа:

Вместо того, чтобы использовать свойство навигации virtual, чтобы включить ленивую загрузку, как это предлагает Пейдж Кук, вы также можете быстро загрузить коллекцию:

var query = dbContext.Documents
    .Where(d => d.Id == "MyDoc")
    .Include(d => d.MetadataList);

Если вы не используете lazy loading, вы всегда должны четко определить в своих запросах, какое свойство навигации-ссылки и коллекции - вы хотите загрузить вместе с вашей сущностью.

Вам нужно объявить свойство MetadataList в классе Document как виртуальную коллекцию ICollection, чтобы EF мог правильно отобразить его:

public virtual ICollection<MetadataValue> MetadataList { get; set; }

Самый простой способ-использовать MetadataValueID в качестве ключа (вместо использования DocumentID).