Entity Framework 4: сохранение одного объекта несколькими не работает - PullRequest
1 голос
/ 01 ноября 2010

Вот общий сценарий
У меня есть эти лица
Пользователь
ИД пользователя
Имя пользователя
...

UserQuestion
UserQID
ИД пользователя
UserQuestion
UserAnswer


У одного пользователя может быть много вопросов, но один вопрос прикреплен к одному пользователю.
В моем примере я создаю 3 пустых объекта (UserQuestion). Затем я прикрепляю эти вопросы к пользователю.
В представлении для каждого вопроса в текстовом поле ответа я использую ElementAt, чтобы указать каждый объект UserQuestion.
Почему я не могу сохранить эти 3 вопроса


В контроллере

public ActionResult ChooseQuestion()
{
    IUserRepository repUser = new UserRepository(EntityFactory.GetEntity());
    User usr = repUser.GetUserByID(Convert.ToInt32(Session["UserID"]));
    usr.UserQuestions.Add(new UserQuestion());
    usr.UserQuestions.Add(new UserQuestion());
    usr.UserQuestions.Add(new UserQuestion());
    var ViewModel = new UsrViewModel()
                    {
                        UserInfo = usr
                    };   
    return View(ViewModel);

}

[HttpPost]
public void ChooseQuestion(User UserInfo)
{
    UpdateModel(User, "UserInfo");
    EntityFactory.GetEntity().SaveChanges();
}

На мой взгляд

<%: Html.TextBoxFor(model => model.UserInfo.UserName)%>
...
<%: Html.TextBoxFor(model => model.UserInfo.LastName%>
...
<%: Html.TextBoxFor(model => model.UserInfo.UserPassword%>
..
<h2>Question Creation</h2>
<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(0).UserQuestion)%>
<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(0).UserAnswer)%>

<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(1).UserQuestion)%>
<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(1).UserAnswer)%>

<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(2).UserQuestion)%>
<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(2).UserAnswer)%>

3

Ответы [ 5 ]

3 голосов
/ 10 декабря 2010

На основании поста Фила Хаака у вас должен быть только порядковый номер в атрибуте имени, например:

<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(0).UserQuestion, new {name="UserInfo.UserQuestion0.UserQuestion} )%>

Обычно встроенный метод HtmlHelper.TextboxFor выполняет атрибут имениправильно, если он находится в цикле for.

Поскольку я не рядом с моим VS, я не могу попробовать эту магию для себя, но вы можете проверить статью Фила, если застряли.

0 голосов
/ 07 декабря 2010

Похоже, что вы запускаете SaveChanges для новой сущности, которая не содержит никаких изменений, отличных от той, которая содержит информацию, обновленную клиентом.

0 голосов
/ 03 декабря 2010

Ошибка в том, что

<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(0).UserQuestion)%>
<%: Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(1).UserQuestion)%>

Генерирует HTML-код:

<input id="UserQuestion" name="UserQuestion" type="text" value="UserQuestion" />
<input id="UserQuestion" name="UserQuestion" type="text" value="UserQuestion" />

Как видите, есть входы с одинаковыми id s, что запрещено.Поэтому, когда вы отправляете данные обратно в контроллер, через PostParameters отправляется только одно значение: UserQuestion =, без индексов, без префиксов, без UserQuestions.UserQuestion[0].Для более подробного изучения подобного вопроса я предлагаю использовать Fiddler и перехватывать трафик, отправляемый вашими формами.

Вторая проблема с вашим кодом заключается в том, что вы используете UpdateModel(User, "UserInfo") и параметр UserInfo (типаПользователь).(Кстати: как этот код компилируется? Конечно, не должен).Лучше использовать FormCollection в качестве параметра при вызове UpdateModel.Потому что в вашем случае переменная UserInfo уже обновлена.
Что касается меня, вы делаете странные вещи, пытаясь редактировать всю коллекцию.

0 голосов
/ 07 декабря 2010

Заменить код следующим образом:

<h2>Question Creation</h2>
<% for (int i = 0; i < Model.UserInfo.UserQuestions.Count; i++) { %>
  <%: Html.TextBoxFor(model => model.UserInfo.UserQuestions[i].UserQuestion)%>
  <%: Html.TextBoxFor(model => model.UserInfo.UserQuestions[i].UserAnswer)%>
<% } %>

тогда, по крайней мере, ваш код сухой.

[HttpPost] public void ChooseQuestion (Пользователь UserInfo) { IUserRepository repUser = new UserRepository (EntityFactory.GetEntity ()); Пользователь usr = repUser.GetUserByID (Convert.ToInt32 (Session ["UserID"]));

UpdateModel(usr);
EntityFactory.GetEntity().SaveChanges();

}

в зависимости от того, существуют вопросы или нет, это должно работать. объект UserInfo должен содержать ваши вопросы, вы можете foreach ответить на них и добавить их вручную.

0 голосов
/ 03 ноября 2010

не уверен, что именно вы ищете:

кажется, вы пропустили таблицу вопросов:

question
---------
question_id
question_text

затем свяжите это с пользователем

user_question
--------------
user_id
question_id
answer
...