0

イベントを編集するための単一のフォームがあり、ユーザーは (a) FormView でイベントの詳細 (タイトル、説明、日付など) を編集し、(b) 連絡先の ListView を表示および編集できます。イベントに登録しました。

これは、イベントへの連絡先の追加と削除を可能にする LinqDataSource です。

<asp:linqdatasource runat="server" id="ContactsDatasource" contexttypename="Db" tablename="ContactsCalendarEventsXtabs" autogeneratewhereclause="true" enabledelete="true" enableinsert="true">
    <whereparameters>
        <asp:querystringparameter name="CalendarEventID" querystringfield="id" type="Int32" />
    </whereparameters>
    <insertparameters>
        <asp:querystringparameter name="CalendarEventID" querystringfield="id" type="Int32" />
    </insertparameters>
</asp:linqdatasource>

これは正常に機能しますが、もちろん、変更が加えられたときにデータベースへの変更が保持されます。イベントがすでに作成されている場合にのみ機能します。理想的には、ListView への変更は、FormView が保存されたときにのみ保持されるようにしたいと考えています (そのため、誰かが ListView に変更を加えてから FormView をキャンセルすると、変更は破棄されます)。同じように、新しいイベントを作成し、その詳細を入力し、何人かの人を登録できるようにしたいと考えています。FormView が保存されると、イベントの新しい ID が取得され、ListView がその ID を使用して保存されます。

過去 (Linq の前) に、データの変更を一時的に保持したり、FormView からイベント ID を取得したりするなど、大幅にカスタマイズされた独自の FormView および SqlDataSource オブジェクトを使用してこれを達成しました。より標準的な方法はありますか? LinqDataSource を使用してこのシナリオを処理しますか?

4

2 に答える 2

1

そのため、2 つの LinqDataSources を 1 つのトランザクションで効率的にラップする必要があります。LinqDataSource のデータ バインディングとイベントを活用し、コミットを 1 つだけ実行する巧妙な方法があります。このメソッドを使用すると、引き続き動的データ、FormView、GridView、検証などを使用できます。データ ソースへのフックのみに依存します。

マークアップの例:

<FormView>...</FormView>
<ListView>...</ListView>
<LinqDataSource ID="dsEvent" ...> </LinqDataSource>
<LinqDataSource ID="dsContact" ...> </LinqDataSource>
<asp:Button ID="btnSubmit" runat="server" OnClick="btnSubmit_Click" Text="Submit it All!"/>

コード ビハインドでは、単一の [送信] ボタンを使用して、LinqDataSources の動作を模倣しています。データソースを使用してアイテムを挿入すると、新しいオブジェクトが作成され、オブジェクトがスナッフルされ、2 番目のオブジェクトに対して再度実行されます。2 つのアイテムと必要なその他のロジックをリンクし、単一のトランザクションとしてデータベースに挿入します。重要なのは、Inserting イベントで Cancel フラグを設定して、データソースが実際にデータベースに挿入されないようにすることです。

protected void btnSubmit_Click(object sender, EventArgs e)
{
    Event evt = null;
    Contact contact = null;

    dsEvent.Inserting += (o,ea) => { evt = (ea.NewObject as Event); ea.Cancel = true; };
    dsEvent.InsertItem(true);
    dsContact.Inserting += (o, ea) => { contact = (ea.NewObject as Contact); ea.Cancel = true; };
    dsContact.InsertItem(true);

    evt.Contacts.Add(contact);

    using (var dbContext = new ContactsCalendarEventsXtabs())
    {
        dbContext.Events.InsertOnSubmit(evt);
        dbContext.SubmitChanges();
    }
}
于 2009-02-17T04:34:51.417 に答える
0

テーブル間に外部キーが設定されていますか?そうすると、新しいイベントのリストを保存するときに例外がスローされます。

また、トピックについては、プログラムでイベントとリストレコードを同時に作成する方法があります。

しかし、あなたはいくつかのコードを書かなければならないでしょう。

create all list items programmaticaly.
create event proggramaticaly.
event myevent = new event();
event.someprop = zzxxx;

link them programmaticaly.
then use  yourdatacontext.events.InsertOnSubmit(event);

リストアイテムについても同じです。

ScottGuのブログLINQシリーズには、これが確実に記述されています

于 2008-11-09T20:18:23.540 に答える