1

もう一度、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 は私を夢中にさせています!

よろしくお願いします

4

1 に答える 1

1

MVC 3 で同じ問題が発生しました。これは、モデル バインダーがモデル クラスの作成中にモデル クラスのすべてのパブリック プロパティを設定するために発生すると考えられます。したがって、に設定user.ClientIDされ1、次にuser.Clientに設定されますnull(フォーム コレクションに存在しないため)。そしてその後、 の値もuser.ClientIDなりnullます。したがって、次のようにバインディングからクラス のプロパティ
を除外する必要があります。ClientUser

public ActionResult Save([Bind(Exclude="Client")]User user, FormCollection form)

これは私にとってはうまくいきました。

于 2012-07-28T20:11:40.960 に答える