もう一度、Linq to Sql と MVC Model Binder で問題が発生しました。
Linq to Sql で生成されたクラスがあり、それらを説明するために、次のようになります。
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 クラスには null 許容の ClientID と SiteID があります。
これで、ユーザーが「ユーザー」オブジェクトを編集できるビューができました。このビューには、すべての「ユーザー」プロパティのフィールドがあります。フォームが送信されると、適切な「保存」アクションが UserController で呼び出されます。
public ActionResult Save(User user, FormCollection form)
{
//form['SiteID'] == 1
//user.SiteID == 1
//form['ClientID'] == 1
//user.ClientID == null
}
ここでの問題は、値が FormCollection にある場合でも、ClientID が設定されず、常に null であることです。
何が問題なのかを把握するために、Linq to Sql デザイナーで生成されたクラスの ClientID および SiteID のゲッターとセッターにブレークポイントを設定しました。次のことに気付きました: SiteID が設定され、次に ClientID が設定されていますが、Client EntityRef プロパティが null 値で設定されているため、ClientID も null に設定されています! Client プロパティを設定しようとしている理由と内容がわかりません。Site プロパティ セッターが呼び出されることはなく、Client セッターのみが呼び出されるためです。
次のように FormCollection から ClientID を手動で設定します。
user.ClientID = int.Parse(form["ClientID"].ToString());
以前にすでに null に設定されていたため、「ForeignKeyReferenceAlreadyHasValueException」をスローします。私が見つけた唯一の回避策は、生成された部分 User クラスをカスタム メソッドで拡張することです。
Client = default(EntityRef<Client>)
しかし、これは満足のいく解決策ではありません。私はそれがこのように動作するべきではないと思いますか?
誰か教えてください。これまでのところ、Linq to Sql は私を夢中にさせています!
よろしくお願いします