代码之家  ›  专栏  ›  技术社区  ›  JoshJordan

用Linq-to-SQL实现分层数据绑定

  •  1
  • JoshJordan  · 技术社区  · 15 年前

    我正在尝试使用Linq To SQL实现一个相当简单的数据绑定场景。

    我有一个facultymember表,其模式如下:

    • FacultyMemberID-内部PK
    • 名称-nvarchar
    • 大学-国际FK到大学表

    等等。还有其他各种字符串属性。

    我生成LTS数据类。我把LinqDataSource和GridView放在一个页面上,同时启用update和delete,我就很高兴了。没有代码,我可以更新字符串属性。在UniversityID上使用一个下拉列表进行一点操作,我也可以更新一对多的关系。是的。

    现在,假设我抛出了一个多对多映射表。比如说部门成员制,它将员工映射到部门。DivisionMembership使用简单而明显的模式:

    • FacultyMemberID-int PK,FK到FacultyMembers表
    • DivisionID-int PK,FK到Divisions表

    现在,当我将一行GridView放入EditMode时,我遇到了一个问题,因为我不知道如何更新多对多关系。我做了一些其他的选择,现在我想找一个列表视图在里面工作。我在做这样的事情:

    <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,我直接绑定到属性(如所述 here )
    • 我用数据提示器。 绑定() 我用的是数据库。 评估() 部门成员资格。

    如果我切换到DivisionMemberships的Bind(),则会得到EntitySet的NotSerializableException。如果我使用Enter(),我必须自己编写ListVIEW的OnDeleand和OnScess方法,并且我不想删除或插入分区成员,直到整个FulultEnter成员行退出EditMode。我可能会创建一个DataContext并将其保存在会话中,因为我没有其他方法来标记分区成员身份以进行更新。

    我认为这个场景很容易实现开箱即用,但是我迷路了。有什么建议吗?具体地说,我应该与Bind()搏斗并尝试使EntitySet可序列化,我应该咬紧牙关并编写上面描述的有点骇人听闻的代码,以便在会话中存储DataContext,直到OnRowUpdating事件触发,还是完全走错了路?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Robert Harvey    15 年前

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

    显然,用普通的数据绑定是做不到这一点的。我不太想把这个储存在会议上,但我知道你不想回邮。

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

        2
  •  1
  •   Michael Dausmann    15 年前

    在我看来,乔希,试图在教师网格内管理你的多对多关系不是正确的方法。事实上,我无法想象这将如何在网格内工作,我并不惊讶你会迷失方向:)

    最好使用“详细信息”页面,其中的上下文是=单个教员,并为部门成员资格维护提供“双重列表”界面。这将包括两个清单。

    右边的列表显示教职员工已经是其成员的所有部门(部门成员行,其中faculty member id=上下文id),左边的列表将显示所有剩余的部门。然后,您可以在列表之间提供“>>”和“<<”按钮,以便在分区中添加/删除教职员工(插入/删除分区成员行)

    迈克尔