2008-11-07 63 views
0

我有一個用於編輯事件的窗體,其中用戶可以(a)在FormView中編輯事件的細節(標題,描述,日期等)和(b)查看和編輯聯繫人的ListView誰是註冊的事件。LinqDataSource/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和SqlDataSource對象完成了這個任務,它們負責臨時保存數據更改,從FormView獲取事件ID等。使用LinqDataSource處理此場景的更標準方法?

回答

0

您是否在表格之間設置了外鍵? 如果你這樣做 - 那麼它應該在保存新事件列表時拋出異常。

而關於主題,有一種方法可以同時創建一個事件+列表記錄programmaticaly。

但你必須寫一些代碼。

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系列有這一個肯定

1

那麼有效,你想換兩個LinqDataSources在單個事務描述。有一種偷偷摸摸的方式來利用LinqDataSource數據綁定和事件,並且仍然只做一次提交。使用這種方法,你仍然可以使用動態數據,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的行爲。您可以使用數據源來插入該項目,該項目將創建新對象,將對象啃掉,然後再次爲第二個對象執行操作。將兩個項目鏈接在一起,並將其他任何邏輯鏈接起來,然後將其作爲單個事務插入到數據庫中。關鍵是在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(); 
    } 
}