我正在嘗試Linq To SQL的一種相當簡單的數據綁定方案。Linq to SQL的分層數據綁定
我有FacultyMembers的表,其模式看起來是這樣的:
- FacultyMemberID - 詮釋PK
- 名稱 - 爲nvarchar
- UniversityID - 詮釋FK到大學表
等等。還有其他各種字符串屬性。
我生成LTS數據類。我在頁面上放置了一個LinqDataSource和一個GridView,爲兩者都啓用了更新和刪除功能,而且我很快樂。沒有代碼,我可以更新我的字符串屬性。在UniversityID上使用DropDownList進行一些操作,我也可以更新該一對多關係。好極了。
現在,讓我說我扔在一個多對多的映射表。讓我們說分部會員,它將教職員工映射到分部。 DivisionMembership使用簡單而明顯的模式:
- FacultyMemberID - 詮釋PK,FK到FacultyMembers表
- DivisionID - 詮釋PK,FK到分部表現在
,當我走了一排我GridView到EditMode中,我遇到了一個問題,因爲我不知道如何更新多對多關係。我討論了幾個替代方法,現在我試圖讓ListView在那裏工作。我正在做這樣的事情:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
AllowPaging="True" AllowSorting="True" PageSize="25" DataKeyNames="FacultyMemberID" >
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
<asp:TemplateField HeaderText="University" SortExpression="UniversityID">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Eval("University.Name") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="DropDownList2" runat="server"
DataSourceID="LinqDataSourceUniversities" DataTextField="Name"
DataValueField="UniversityID" SelectedValue='<%# Bind("UniversityID") %>'>
</asp:DropDownList>
<asp:LinqDataSource ID="LinqDataSourceUniversities" runat="server"
ContextTypeName="NYDERHE.NYDERHEDataClassesDataContext"
Select="new (UniversityID, Name)" TableName="Universities">
</asp:LinqDataSource>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Division">
<EditItemTemplate>
<asp:ListView ID="ListView1" runat="server"
InsertItemPosition="LastItem" DataSource='<%# Eval("DivisionMemberships") %>'><ItemTemplate>
<li style="">FacultyMemberID:
<asp:Label ID="FacultyMemberIDLabel" runat="server"
Text='<%# Eval("FacultyMemberID") %>' />
<br />
DivisionID:
<asp:Label ID="DivisionIDLabel" runat="server"
Text='<%# Eval("DivisionID") %>' />
<br />
Division:
<asp:Label ID="DivisionLabel" runat="server" Text='<%# Eval("Division") %>' />
<br />
FacultyMember:
<asp:Label ID="FacultyMemberLabel" runat="server"
Text='<%# Eval("FacultyMember") %>' />
<br />
<asp:Button ID="DeleteButton" runat="server" CommandName="Delete"
Text="Delete" />
</li>
</ItemTemplate>
</asp:ListView>
</EditItemTemplate>
等等。上面的一些喋喋不休,但ListView是相當詳細的,所以我不想超載的頁面。
事情,這裏要注意:
- 對於我的大學聯合,我使用的項目一個新的LinqDataSource和查詢的WHERE的UniversityID匹配,則綁定新UniversityID(DDL值)與FacultyMember,而對於DivisionMemberships,我直接綁定到屬性(如描述here)
- 我使用DataBinder。 Bind() for UniversityID,而我使用DataBinder。 Eval() for DivisionMemberships。
如果我切換到DivisionMemberships的Bind(),我得到一個NotSerializableException的EntitySet。如果我堅持使用Eval(),我必須自己爲ListView編寫OnDelete和OnInsert方法,並且我不想刪除或插入DivisionMemberships,直到整個FacultyMember行退出EditMode。我可能會創建一個DataContext並將其粘貼到會話中,因爲我沒有其他方法來標記DivisionMemberships的更新。
我認爲這種情況很容易啓用,但我迷路了。有關從哪裏出發的建議?具體來說,我應該與Bind()搏鬥並嘗試使EntitySet可序列化,那麼我是否應該咬緊牙關,寫上面描述的用於在會話中存儲DataContext的有點黑客代碼,直到OnRowUpdating事件觸發爲止,還是我完全錯誤?
唷,這是一個漫長的。抱歉!希望你能夠理解它。 – JoshJordan 2009-07-03 14:32:16