1

我正在尝试使用 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 事件触发的有点骇人听闻的代码,还是我完全走错了路?

4

2 回答 2

1

Seems to me Josh that trying to manage your many-to-many relationship from within the Faculty Member grid is not the right approach.In fact, I can't really visualise how this would work inside a grid, I am not surprised that you are lost :)

Better to use a 'detail' page where the context is = to a single Faculty member and provide a 'double list' interface for division membership maintenence. This would consist of 2 lists.

The righthand list shows all the divisions to which the faculty member is already a member(DivisionMembership rows where FacultymemberId = the context id) , the left hand list would show all the remaining Divisions. You could then provide '>>' and '<<' buttons in between the lists to add/remove the Faculty member from the divisions (Inserting/deleting DivisionMemberships rows)

Michael

于 2009-07-09T02:55:43.697 回答
1

你是对的,它很长,但是包含一些代码,JIC。

很明显,您无法使用普通的 DataBinding 执行此操作。我不太热衷于将其存储在会话中,但我知道您不想要回发。

您可能想要做的是设置一个 Ajax 调用,以便您可以将您的新记录(或您的记录更改)粘贴到 DataContext 中。提交表单时,您可以在 DataContext 上调用 SubmitChanges。

于 2009-07-03T18:36:40.883 回答