Я использую версию Entity Framework версии 4.2. В моем маленьком тестовом приложении есть два класса:Привязка модели к контроллеру при отправке формы - свойства навигации не загружаются автоматически
public class TestParent
{
public int TestParentID { get; set; }
public string Name { get; set; }
public string Comment { get; set; }
public virtual ICollection<TestChild> TestChildren { get; set; }
}
public class TestChild
{
public int TestChildID { get; set; }
public int TestParentID { get; set; }
public string Name { get; set; }
public string Comment { get; set; }
public virtual TestParent TestParent { get; set; }
}
Заполнение объектов данными из базы данных хорошо работает. Поэтому я могу использовать testParent.TestChildren.OrderBy(tc => tc.Name).First().Name
и т. Д. В моем коде.
Затем я построил стандартную форму редактирования для своих тестовых партов. Внешний вид контроллера, как это:
public class TestController : Controller
{
private EFDbTestParentRepository testParentRepository = new EFDbTestParentRepository();
private EFDbTestChildRepository testChildRepository = new EFDbTestChildRepository();
public ActionResult ListParents()
{
return View(testParentRepository.TestParents);
}
public ViewResult EditParent(int testParentID)
{
return View(testParentRepository.TestParents.First(tp => tp.TestParentID == testParentID));
}
[HttpPost]
public ActionResult EditParent(TestParent testParent)
{
if (ModelState.IsValid)
{
testParentRepository.SaveTestParent(testParent);
TempData["message"] = string.Format("Changes to test parents have been saved: {0} (ID = {1})",
testParent.Name,
testParent.TestParentID);
return RedirectToAction("ListParents");
}
// something wrong with the data values
return View(testParent);
}
}
Когда форма размещена на сервер модель появится связывание работает хорошо - то есть testParent выглядит хорошо (ID, имя и комментарий установить, как и ожидалось). Однако свойство навигации TestChildren остается в NULL.
Это, я думаю, не удивительно, так как привязка модели просто извлекает значения формы, поскольку они были отправлены из браузера и вталкивает их в объект класса TestParent. Однако для заполнения TestParent.TestChildren требуется немедленная обратная связь с базой данных, которая несет ответственность за структуру Entity Framework. И EF, вероятно, не участвует в процессе привязки.
Я ожидал, что ленивая загрузка начнется, когда я позвоню testParent.TestChildren.First()
. Вместо этого это приводит к ArgumentNullException.
Нужно ли пометить объект особым образом после привязки к модели, чтобы Entity Framework выполнила ленивую загрузку? Как я могу это достичь?
Очевидно, что я мог бы вручную восстановить детей со вторым репозиторием testChildRepository
. Но (a) не чувствует себя хорошо и (b) приводит к проблемам с тем, как настроены мои хранилища (каждый из которых использует свой собственный DBC-текст), что является проблемой, с которой мне еще не удалось договориться.
Большое спасибо за ваш ответ и извините за мой поздний ответ. Я был в сети последние три дня и довольно болотистый. Я думаю, ваше объяснение показало мне, что есть некоторые фундаментальные ямы в моем знании EF. Я работал над примером Университета Contoso на веб-сайте Microsoft и в некоторых вводных статьях. Не могли бы вы порекомендовать ресурс, который я могу использовать, чтобы двигаться немного дальше? – ralfonso
Что касается вашего последнего замечания о привязке к ViewModels: это техника, о которой я не знал. Я использую ViewModels, но только для передачи их в представления. Не могли бы вы объяснить, почему выгодно использовать модель представления вместо класса из моей модели домена? Так как я в значительной степени отображаю все свойства моего класса, поскольку поля ввода в исходном представлении не будут выглядеть так же, как мой класс? Это означает, что мне нужно, чтобы они синхронизировались, когда я добавляю больше свойств.Если я использую Html.EditorForModel() в представлении запроса GET, тогда не нужно будет настраивать добавленные свойства. – ralfonso
@ralfonso: Джулия Лерман написала книгу о Code-First: http://www.amazon.com/Programming-Entity-Framework-Code-First/dp/1449312942 и написала статьи и создала видео: http: // thedatafarm .com/blog/data-access/code-first-entity-framework-4-1-videos-and-articles-on-msdn/I вам нравится учиться, просматривая видео, которые я бы рекомендовал Pluralsight: http: // www. multipalsight-training.net (у них есть материал о MVC и EF и многие другие темы). Некоторые из видеороликов бесплатны, но коммерческие подписки вполне доступны. – Slauma