2015-03-25 5 views
0

кажущийся дубликат для EF5, это EF6, но ответ мне нужно был виртуальным (отложенная загрузка) нет в кажущемся дубликатеКод Первый EF6 не извлекает внутренние объекты?

Я думаю, что я облажался мой код первого подхода ...

сначала мы делали код сначала из базы данных, и все работало хорошо, однако из-за цепи появились новые требования, и поэтому мы отказались от этой базы данных, обновили код, чтобы он соответствовал, а затем сгенерировал новую базу данных, используя код в первую очередь.

Мы сохранили старый проект на месте, просто изменили все, что нам нужно, и очистили код, удалив все автоматически сгенерированные вещи из исходного (сначала код из базы данных), чтобы мы могли сначала выполнить правильный код в базе данных.

проблема здесь заключается в том, что класс (я упростив до двух классов против всей кодовой базы) ImageCoordinates содержит объект ImageData, но в коде, когда я получить Teh ImageCoordinates возвращает нуль для объекта ImageData ...

public class ImageCoordinate 
{ 
    [Key] 
    public Guid uid { get; set; } 

    [StringLength(50)] 
    public string coordinates { get; set; } 

    public ImageData ImageData { get; set; } 
} 

public class ImageData 
{ 
    [Key] 
    public Guid uid { get; set; } 

    [Column("imageData")] 
    public byte[] imageData1 { get; set; } 

    [StringLength(50)] 
    public string fileName { get; set; } 
} 

класс DbContext содержит

public class dbContext : DbContext 
{ 
    public dbContext(string connectionString) 
     : base(connectionString) 
    { 
    } 
    public virtual DbSet<ImageCoordinate> ImageCoordinates { get; set; } 
    public virtual DbSet<ImageData> ImageDatas { get; set; } 
} 

когда retreiving ...

var foo = dc.ImageCoordinates.FirstOrDefault(x => x.uid == uid); 

foo.ImageData //is null 

на стороне базы данных автогенерируемая структура ....

uid          coordinates ImageData_uid 
AC5712F6-B69B-44FE-A255-3F3227E02802 34,15,158,56 FFE0473D-4CF7-4B26-BE8A-A24FC79B6695 

может кто-нибудь объяснить, что я сделал неправильно здесь, чтобы предотвратить систему от генерации этой ссылке и retreiving все данные для imageCoordinate?

ответ

2

Так что либо объявляйте связанное с вами свойство как virtual, чтобы включить ленивую загрузку, либо используйте Include для загрузки связанных данных на момент создания.

public virtual ImageData ImageData { get; set; } 

или

dc.ImageCoordinates 
    .Include(ic => ic.ImageData) 
    .FirstOrDefault(x => x.uid == uid); 
1

Если вы хотите, чтобы вы навигационные свойства lazy loaded то вам нужно объявить их как virtual:

public class ImageCoordinate 
{ 
    //... 
    public virtual ImageData ImageData { get; set; } 
} 

В этом link вы найдете хорошее объяснение о требования, которым вы должны следовать, если вы хотите включить ленивую загрузку для своих объектов и изменить отслеживание Entity Framework в ваших классах, когда происходят изменения.

FYI, EF имеют три способа загрузки связанных объектов: lazy loading, eager loading и explicit loading. Наиболее часто используются первые два.

1

Вас интересует Lazy Загрузка. Он включен по умолчанию. Он должен получить все дочерние entites, которые объявили с ключевым словом virtual. Поэтому подумайте об изменении этого свойства на virtual.

public class ImageCoordinate 
{ 
    ... 
    public virtual ImageData ImageData { get; set; } 
} 

Или вы можете использовать Include, который загрузит дочернюю сущность, заявившая в запросе. Этот процесс известен как Eager Loading.

dc.ImageCoordinates 
    .Include(x=> x.ImageData) 
    .FirstOrDefault(x => x.uid == uid); 

Кроме того, вы можете включить отложенную загрузку вручную в контексте конструктора:

public MyEntitiesContext() : base("MyEntitiesContext") 
{ 
    this.ContextOptions.LazyLoadingEnabled = true; 
    ... 
} 
+0

У вас есть мой upvote, я не люблю видеть хорошие ответы без upvotes. Конечно, я согласен с тем, что ответ спрянта должен быть отмечен как ответ, потому что он первым ответил на этот вопрос, но наши ответы тоже отвечают на вопрос, и у них есть собственные вклады – octavioccl

+0

@octavioccl Спасибо) –

Смежные вопросы