我再次遇到與LINQ to Sql和MVC Model Binder有關的問題。ASP.NET MVC 2:LINQ到SQL實體w/ForeignKey關係和默認ModelBinder奇怪
我有Sql的Linq生成的類,說明他們,他們看起來與此類似:
public class Client
{
public int ClientID { get; set; }
public string Name { get; set; }
}
public class Site
{
public int SiteID { get; set; }
public string Name { get; set; }
}
public class User
{
public int UserID { get; set; }
public string Name { get; set; }
public int? ClientID { get; set; }
public EntityRef<Client> Client { get; set; }
public int? SiteID { get; set; }
public EntityRef<Site> Site { get; set; }
}
「用戶」已與「客戶」和「網站 的關係。 User類具有可空的ClientID和SiteID,因爲管理員用戶沒有綁定到客戶端或站點。
現在我有一個視圖,用戶可以在其中編輯'用戶'對象,該視圖具有所有'用戶'屬性的字段。當表單提交,此時,相應的「保存」行動被稱爲在我的UserController的:
public ActionResult Save(User user, FormCollection form)
{
//form['SiteID'] == 1
//user.SiteID == 1
//form['ClientID'] == 1
//user.ClientID == null
}
在這裏的問題是,客戶端ID從未設置,它始終是空,即使值是的FormCollection。
爲了弄清楚出了什麼問題,我在Linq to Sql設計器生成的類中爲ClientID和SiteID獲取器和設置器設置了斷點。我注意到以下幾點: 正在設置SiteID,然後設置ClientID,但隨後客戶端EntityRef屬性被設置爲空值,而該值又將ClientID設置爲空!我不知道爲什麼以及試圖設置客戶端屬性的原因,因爲Site屬性設置器從不被調用,只有客戶端設置器被調用。
手動從的FormCollection設置客戶端ID是這樣的:
user.ClientID = int.Parse(form["ClientID"].ToString());
拋出一個「ForeignKeyReferenceAlreadyHasValueException」,因爲它已經被設置之前爲null。我發現唯一的解決方法是用自定義方法擴展生成的部分用戶類:
Client = default(EntityRef<Client>)
但這不是一個令人滿意的解決方案。我不認爲它應該這樣工作?
請賜教某人。到目前爲止,Linq to Sql讓我瘋狂!我剛剛在同樣的問題與MVC 3運行
問候