实体框架4:保存一个到多个实体不起作用

时间:2010-10-31 21:31:50

标签: asp.net-mvc entity-framework asp.net-mvc-2 entity-framework-4 entity-relationship

这是常见的情况
我有这些实体 用户
用户ID
用户名
...

UserQuestion
UserQID
用户ID
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 个答案:

答案 0 :(得分:3)

基于Phil Haack's post,你应该在你的名字属性中加上序号,如下所示:

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

通常情况下,内置的HtmlHelper.TextboxFor方法会在for循环中正确执行name属性。

由于我现在不在我的VS附近,所以我不能为自己尝试这种魔法,但如果你遇到困难,你可能想查看Phil的文章。

答案 1 :(得分:0)

不确定您到底在寻找什么:

似乎你错过了一个问题表:

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

然后将其链接到用户

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

答案 2 :(得分:0)

错误就是

<%: 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参数(类型为User)。 (顺便说一句:这段代码如何编译?无论如何都不应该)。 调用FormCollection时,最好使用UpdateModel作为参数。因为在您的情况下,变量UserInfo已经更新 至于我,你做的很奇怪,试图编辑整个集合。

答案 3 :(得分:0)

替换代码:

<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(User UserInfo) {     IUserRepository repUser = new UserRepository(EntityFactory.GetEntity());     用户usr = repUser.GetUserByID(Convert.ToInt32(Session [“UserID”]));

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

}

取决于是否存在问题,这应该有效。 UserInfo对象应该包含您的问题,您可以foreach将它们添加到手动中。

答案 4 :(得分:0)

看起来您在一个不包含任何更改的新实体上运行SaveChanges,而不是包含客户更新信息的实体。