Linq to SQL的分层数据绑定

问题描述:

我正在尝试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事件触发为止,还是我完全错误?

+0

唷,这是一个漫长的。抱歉!希望你能够理解它。 – JoshJordan 2009-07-03 14:32:16

你说得对,它很长,但包括一些代码JIC的荣誉。

看起来很明显,你不能用普通的DataBinding做到这一点。我并不太热衷于在会话中存储此内容,但我确实知道您不需要回发。

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

+0

阅读+1,并给我一些连贯的观点:)你提到你不太喜欢使用这个会话,说实话,我也不是。我宁愿有一个原子请求 - 关于如何处理它的任何想法?爱阿贾克斯的想法。 – JoshJordan 2009-07-03 20:29:07

+0

那么,Ajax调用将允许您对DataContext进行“更新此成员资格”调用,而不需要完整的回发。 Ajax可以通过其中一个Ajax脚本处理程序控件/面板进行处理。对不起,我没有资格更详细地回答你的问题。我几个月前就以这种方式构建了一个原型,但感到沮丧并转而使用ASP.NET MVC。在MVC中,这可以通过AJAX调用或JSON调用来处理,并直接在C#类中实现特定的方法。 – 2009-07-03 20:43:53

对我来说似乎Josh认为,试图从教师成员网格内管理你的多对多关系并不是正确的方法。事实上,我无法真正想象如何在网格内工作,我是不会感到惊讶,你是迷失:)

更好地使用'细节'页面的上下文是=一个教师成员,并提供一个'双列表'界面的师成员维护。这将包括2个列表。

右侧列表显示教员已经成为成员的所有分部(DivisionMembership行,其中FacultymemberId =上下文ID),左侧列表将显示所有其余的分部。然后,您可以提供“>>”和“< <”按钮之间的列表中添加/从部门删除学部委员(插入/删除DivisionMemberships行)

迈克尔