MVC 3 - Виджет отлично в действии Create, но имеет нулевые значения в действии View - PullRequest
0 голосов
/ 02 апреля 2011

Я использую ASP.NET MVC3 с Entity Framework.

У меня есть Widget контроллер со стандартными действиями CRID Widget.

В своем действии Create я успешно создал новый объект Widget, который имеет два объекта FooBar. Это добавляется в мою базу данных просто отлично, и действие перенаправляет на действие View.

[HttpPost]
public ActionResult Create(Widget model)
{
    if (ModelState.IsValid)
    {
        //At this point, the widget has two FooBar properties. I can see the values for these FooBars just fine.
        if (repo.AddWidget(model))
        {
            ViewBag.Message = "Your widget has been created.");
            return RedirectToAction("View", new { id = model.Id });
        }
        else
        {
            ViewBag.Error = "Woops, something went wrong. Please try again.");
        }
    }
    return View(model);
}

В действии View я извлекаю только что созданный Widget из своего репозитория - за исключением того, что теперь два свойства FooBar равны нулю.

public ActionResult View(int id)
{
    var widget = repo.GetWidget(id);

    if (widget == null)
    {
        ViewBag.Error = "No widget found for the specified ID";
        return RedirectToAction("Find");
    }
    //At this point, the widget has two null values for the FooBar1 and FooBar 2 properties
    return View(widget);
}

В самой базе данных я вижу правильные значения FooBar ID на моем Widget.

Моя модель настроена почти так же, как показано в этом руководстве: http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

public class WidgetContext : DbContext
{
    public DbSet<Widget> Widgets { get; set; }
    public DbSet<FooBar> FooBars { get; set; }
}

Кто-нибудь может подсказать, как мне начать отслеживать эту проблему?

Обновление: Я должен уточнить, что значения равны нулю всякий раз, когда я вызываю действие View, а не только после Create.

1 Ответ

1 голос
/ 02 апреля 2011

Похоже, FooBar - это отдельная сущность, а FooBar1 и FooBar2 - свойства навигации. В этом случае вы должны либо явно сказать, что хотите загрузить их (мы называем это энергичной загрузкой):

var widget = context.Widgets
                    .Include(w => w.FooBar1)
                    .Include(w => w.FooBar2)
                    .SingleOfDefault(w => w.Id == id);

Примечание. Сильно типизированный параметр Включить требует EF 4.1 для EFv1 или EFv4:

var widget = context.Widgets
                    .Include("FooBar1")
                    .Include("FooBar2")
                    .SingleOfDefault(w => w.Id == id);

или создайте пользовательский строго типизированный метод расширения вот так .

или вы должны включить отложенную загрузку. Ленивая загрузка делает отдельные запросы к базе данных, когда свойства впервые доступны в вашем представлении. Это требует, чтобы FooBar1 и FooBar2 были виртуальными, а контекст должен быть живым при отображении представления. Обычно это обрабатывается отдельным контекстом для каждого HTTP-запроса, где, например, контекст создается и располагается в фабрике пользовательских контроллеров или в пользовательском модуле Http.

Также в следующий раз, пожалуйста, ответьте на свой вопрос. Вы показали много кода, но важные части (класс Windget и метод GetById) отсутствуют. К сожалению, пользователи здесь не являются оракулами, поэтому нам нужно теперь предоставить необходимые детали. Оба метода действий практически не имеют отношения к вашей проблеме.

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