Страницы

Поиск по вопросам

вторник, 9 июля 2019 г.

Не подгружается навигационное свойство

//Объект public class Fcu : Entity { public string Name { get; set; } public int FcuTypeId { get; set; } public virtual FcuType FcuType { get; set; } } //Навигационное свойтво public class FcuType : Entity { //ctor public string Name { get; set; } public virtual ICollection Fcus { get; set; } }
1. Контроллер
[HttpPost] public ActionResult Add(FcuCreateViewModel model) { if (!ModelState.IsValid) return PartialView("~/Views/Fcu/_Add.cshtml", model);
var entity = new Fcu(); entity.Name = model.Name; entity.FcuTypeId = model.SelectedFcuTypeId;
// 1. Сохраняем _fcuService.Save(entity); // 2. Сохранили, теперь нужно его вытащить, нужен объект с уже // заполненным Id, т.к. Id не известен передаем Name var result = _fcuService.GetByName(model.Name);
return Json(new { Fcu = result, Error = string.Empty }); }
2. Сервис
public Fcu GetByName(string name) { var result = _fcuRepository.Get(x => x.Name == name); return result; }
3. Репозиторий
public T Get(Expression> where) { return _dbSet.Where(where).FirstOrDefault(); }
Навигационное свойство пустое:
Когда в отладке раскрываю Results View: то навигационное свойство заполняется (как я понял идет дополнительный зарос к базе)

Что нужно сделать чтобы объект загружался с навигационными свойтвами? Использовать Include? То зачем мне тогда LazyLoading?
Update LazyLoading у меня работает, вот для примера возьмем два теста (где _sut это FcuService):
// Тест - Проходит // в этом тесте я ищу запись по имени // и получаю заполненные поля + навиг. свойтво. все как должно быть. [Test] public void Should_Get_Fcu_By_Name() { var result = _sut.GetByName("Fcu1");
result.FcuType.Should().NotBeNull(); }
//Тест - Не проходит //В этом тесте добавлю в бд новую запись и хочу ее загрузить, но мне //возвращается объект с пустым навигационным свойством, т.е контекст не //ищет объект в базе а просто отдает то что ему передал для сохранения [Test] public void Should_Insert_New_Fcu_And_Load_Back() { var fcu = new Fcu { Name = "newFcu", FcuTypeId = 1 };
_sut.Save(fcu);
var result = _sut.GetByName("newFcu");
result.FcuType.Should().NotBeNull(); }


Ответ

При создании указывайте связанный объект, а не его Id: var fcu = new Fcu { Name = "newFcu", FcuType=_fcuTypeRepo.Get(x=>x.Id==1) }

Комментариев нет:

Отправить комментарий