EntityDataSource обращается к коллекции из другого объекта в GridView

Я не уверен, что мой заголовок точно описывает то, что я пытаюсь сделать.

У меня есть две таблицы в моей Entity Framework, человек и пользователь. Я пытаюсь отобразить сетку пользователей, поэтому я настроил этот EntityDatasource:

<asp:EntityDataSource ID="peopleQuery" runat="server" 
    ConnectionString="name=myEntities" DefaultContainerName="myEntities"
    EnableFlattening="False" EntitySetName="people" Include="location" 
    Where="it.active = 1" OrderBy="it.lastname, it.firstname">    
</asp:EntityDataSource>

Теперь в моем GridView я могу связывать поля, такие как фамилия, имя, адрес электронной почты и поля из таблицы местоположений, такие как адрес и город.

Теперь в моей системе пользовательская запись может быть присоединена к одной или нескольким личным записям. Так что это отношения один ко многим. В сетке я хотел бы отобразить пользователей, связанных с каждым человеком. Я могу сделать это с событием RowDataBound, но это требует дополнительного поиска в БД для каждой строки в базе данных.

Есть ли какой-нибудь эффективный способ перейти от "многих" к концу отношения "один ко многим" с внешним ключом?

На самом деле, это даже не должно быть 1 ко многим. Это может быть 1 к 1, но вы находитесь на другом конце отношения внешнего ключа. Итак, в этом примере EntityDataSource использует таблицу person, но в пользовательской таблице у меня есть поле personid. Таким образом, внешний ключ - user.personid => person.personid. Так как GridView запускается из пользовательской таблицы, как я могу перейти к пользовательской таблице для отображения user.username в моем GridView?

1 ответ

Решение

Вы можете вложить либо gridview, либо ретранслятор в Gridview и использовать отношение для заполнения данных, установив для источника данных отношение:

<asp:EntityDataSource ID="eds" runat="server" 
     ContextTypeName="people" 
     EnableFlattening="False" 
     EntitySetName="people" 
     Include="users" >      
</asp:EntityDataSource>     

<asp:GridView ID="gv" runat="server" AutoGenerateColumns="False" DataKeyNames="PeopleId" DataSourceID="eds"> 
    <Columns>             
        <asp:BoundField DataField="FirstName" HeaderText="First name"  /> 
        <asp:BoundField DataField="LastName" HeaderText="Last name" /> 
        <asp:TemplateField HeaderText="People">
            <ItemTemplate>
            <asp:Repeater ID="rptUsers" runat="server" DataSource='<%# Eval("users") %>'>
                    <ItemTemplate>
                        <%# Eval("username") %>
                    </ItemTemplate>
            </asp:Repeater>
             </ItemTemplate>
         </asp:TemplateField>
    </Columns>
</asp:GridView>

Это предполагает, что у вас есть настройка отношений в вашей модели данных, например:

public class person(){
    public int PersonId{get;set;}
    public string FirstName{ get;set;}
    public string LastName{ get;set;}
    pubic virtual ICollection<user> users { get; set; }
}

public class user(){
    public int UserId{ get;set;}
    public string username{ get;set; }
}
Другие вопросы по тегам