1

這是一個常見的場景
我有這些實體
用戶
用戶ID
用戶名
...

UserQuestion
UserQID
UserID
UserQuestion
UserAnswer
實體框架4:保存一對多實體不起作用


一個用戶可以有很多的問題,但一個問題是連接到一個用戶。
在我的示例中,我創建了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

基於Phil Haack's post你應該有順序編號在你的name屬性,像這樣:

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

通常內置HtmlHelper.TextboxFor方法做屬性的名稱正確,如果它是在一個for循環。

由於我現在不在我的VS附近,我無法爲自己嘗試這個魔術,但是如果卡住了,你可能想檢查Phil的文章。

+0

感謝BorisCallens,這完全是我在找的東西。菲爾哈克郵報正是我需要的。謝謝 。我搜索了一段時間並從未找到答案。一個+++的答案在這裏。感謝其他人如何試圖幫助我,這真的很感激。謝謝。 – 2010-12-10 02:10:08

+0

很高興我能服務;) – 2010-12-10 17:30:57

0

不知道你正在尋找什麼:

似乎你缺少一個問題表:

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

然後鏈接到用戶

user_question 
-------------- 
user_id 
question_id 
answer 
+0

不,這個問題可以與只有一個用戶關聯 – 2010-11-12 22:50:40

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類型)。 (順便說一下:這段代碼是如何編譯的?不管怎麼說)。 當您致電UpdateModel時,最好使用FormCollection作爲參數。因爲在你的情況下,變量UserInfo已經更新。
至於我,你正在做奇怪的事情,試圖編輯整個集合。

+0

好吧忘了UpdateModel你絕對正確。但現在,我把它放在textboxFor <%:Html.TextBoxFor(model => model.UserInfo.UserQuestions.ElementAt(0).UserQuestion)%>替換爲.... – 2010-12-03 19:10:46

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] 公共無效ChooseQuestion(用戶的UserInfo) { IUserRepository repUser =新UserRepository(EntityFactory.GetEntity()); User usr = repUser.GetUserByID(Convert.ToInt32(Session [「UserID」]));

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

}

取決於是否存在問題或不應該工作的。 UserInfo對象應該包含你的問題,你可以foreach他們並添加他們manualy以及。

+0

我,謝謝你的回覆。但這裏的主要問題是我無法做到model.UserInfo.UserQuestions [i] ..這不是一個表...這是一個UserQuestions的實體集合。這意味着我無法直接在表格中指定像[i]這樣的索引。我可以指定它的唯一方法,它與elementAt(i)...爲什麼。 – 2010-12-09 03:17:23

0

看起來您正在一個新的實體上運行SaveChanges,該實體不包含任何更改,而不是包含由客戶端更新的信息。