我正在尝试使用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事件触发,还是完全走错了路?