我正在尝试使用 Linq To SQL 进行我认为相当简单的数据绑定方案。
我有一个 FacultyMembers 表,其架构如下所示:
- FacultyMemberID - int PK
- 名称 - nvarchar
- UniversityID - int FK 到大学表
等等。还有各种其他字符串属性。
我生成 LTS 数据类。我在页面上放置了一个 LinqDataSource 和一个 GridView,为两者启用了更新和删除,我正在我的快乐路上。没有代码,我可以更新我的字符串属性。在 UniversityID 上使用 DropDownList 进行一点操作,我也可以更新该一对多关系。耶。
现在,假设我放入了一个多对多映射表。假设 DivisionMemberships 将 FacultyMembers 映射到部门。DivisionMembership 使用简单明了的模式:
- FacultyMemberID - int PK, FK 到 FacultyMembers 表
- DivisionID - int PK, FK 到 Divisions 表
现在,当我将 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 并查询 UniversityID 匹配的项目,然后将新的 UniversityID(DDL 值)绑定到 FacultyMember,而对于 DivisionMemberships,我直接绑定到属性(如此处所述)
- 我使用数据绑定器。Bind()用于 UniversityID,而我使用 DataBinder。用于 DivisionMemberships 的Eval() 。
如果我切换到 DivisionMemberships 的 Bind(),我会得到 EntitySet 的 NotSerializableException。如果我坚持使用 Eval(),我必须自己为 ListView 编写 OnDelete 和 OnInsert 方法,并且在整个 FacultyMember 行退出 EditMode 之前我不想删除或插入 DivisionMemberships。我可能会为此创建一个 DataContext 并将其粘贴在会话中,因为我没有其他方法来标记 DivisionMemberships 以进行更新。
我认为这种情况很容易开箱即用,但我迷路了。关于从这里去哪里的任何建议?具体来说,我应该与 Bind() 搏斗并尝试使 EntitySet 可序列化,我应该咬紧牙关编写上面描述的用于在会话中存储 DataContext 直到 OnRowUpdating 事件触发的有点骇人听闻的代码,还是我完全走错了路?