2016-10-16 3 views
1

В EF6 у нас был такой вариант:Как загрузить свойство навигации с помощью EF Core?

context.Set<TEntity>().Attach(entity); 
context.Entry(entity).Collection("NavigationProperty").Load(); 

С EF Core "идет 100% строго типизированных" они удалили функцию сбора. Но что следует использовать вместо этого?

Добавлено: Я имею в виду, как загрузить включает/"свойства коллекции навигации" для объекта ATTACHED?

+0

Этот API возвращается в EF Core 1.1 – bricelam

ответ

3

У вас есть 2 метода.

1. Нетерпеливый загрузки

например,

var blogs = context.Blogs 
    .Include(blog => blog.Posts) 
    .ToList(); 

2. Явная нагрузка

например,

var blog = context.Blogs 
    .Single(b => b.BlogId == 1); 

context.Posts 
    .Where(p => p.BlogId == blog.BlogId) 
    .Load(); 

Вы можете прочитать об этом здесь: Loading Related Data

Update:

Вы можете использовать TrackGraph API для такого использования case.Here ссылка: graph behavior of Add/Attach

Другая ссылка: DbSet.Add/Attach and graph behavior

+0

Два метода? Это не так, потому что мы обсуждаем сценарий, в котором объект привязан, и это важно. Такой сценарий используется, когда сущность «создается» из полей формы HTTP-запроса, и вам нужно объединить ее ссылки «Многие-ко-многим» (для этого вы должны загрузить текущее состояние), а затем найти, что удалить. –

+0

см. ** Обновление **. – Sampath

+0

Спасибо за ваши комментарии и ссылки. Я вижу, что есть смысл в изменении поведения отслеживания изменений ВО ВРЕМЯ ATTACH, но не могу понять, как это связано с возможностью блокировки загрузки свойства навигации для СУЩЕСТВУЮЩЕГО СУЩЕСТВУЮЩЕГО объекта. Может быть, у вас есть свои мысли по этому поводу? –

1

См. Ниже Код,
Я вставляю данные в таблицу UserRef, а также другую таблицу, у которой у нас много двух отношений.

public void AddUser(User user, IEnumerable<UserSecurityQuestion> securityQuestion, string password) 
    { 
     var userModel = _mapper.Map<User, UserRef>(user); 
     userModel.CreateTime = DateTime.Now; 

     userModel.UserNewsLetterMaps.ToList().ForEach(u => this._context.UserNewsLetterMaps.Add(u));    
     this._context.RoleRefs.Attach(new RoleRef() { RoleId = (int)user.UserRole, UserRefs = new List<UserRef> { userModel } }); 
     userModel.ResidenceStatusRefs.ToList().ForEach(u => this._context.ResidenceStatusRefs.Attach(u)); 
     this._context.UserRefs.Add(userModel); 
     this.Save(); 
    } 
+0

Вы также можете загружать связанный объект вручную по запросу linq –

+0

Да что-то вроде этого должно работать: загружать объект из контекста, а затем каким-то образом настраивать« navigationPropertis »между двумя объектами,« прикрепленными »и этим новым" получить из контекста "... Если я правильно понимаю код ... Но это так уродливо и так грустно ... –

+0

Кажется, я понял, что« явная загрузка »должна работать для прикрепленных объектов. Следует экспериментировать с этим. –

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