2010-02-17 21 views
19

Tengo dos tablas de SQL Server con claves principales (PK) y una clave externa (FK) que unen las dos tablas:columnas de dos tablas de bases de datos relacionadas en uno ASP.NET GridView con EntityDataSource

1) Table "Order" 

OrderID, int, PK 
AddressID, int, FK 
... 

2) Table "Address" 

AddressID, int, PK 
City, nvarchar(50) 
... 

Entonces he creado un Modelo de datos de entidad (ADO.NET) a partir de esas dos tablas. Ahora en mi página web (ASP.NET) coloco un GridView con EntityDataSource. En mi GridView quiero mostrar dos columnas:

  • IDPedido
  • City (perteneciente a ese fin y unidos por la tecla AddressID)

¿Cómo puedo hacer eso? Mi problema es: cuando configuro Entity Data Source, puedo seleccionar un "EntitySetName" que puede ser "Order" o "Address" pero no ambos, ni puedo seleccionar ningún tipo de relación. Si selecciono "orden" como EntitySetName continuación, en el GridView puedo añadir las columnas

  • IDPedido
  • Dirección
  • Address.AddressID

Adición de la columna "Dirección" muestra las celdas vacías . Al agregar "OrderID" y "Address.AddressID", se muestran los ID esperados. ¿Pero cómo puedo agregar la "Ciudad" de la dirección relacionada a mi GridView?

¡Gracias por la ayuda con anticipación!

Editar: Aclaración:

El Marco de la entidad ha creado una "orden" de clase y una "dirección" clase correspondiente a las tablas de la base. La clase "Orden" tiene una referencia a un objeto "Dirección" como propiedad de navegación, correspondiente a la relación 1-n entre la tabla Dirección y Orden.

Básicamente quiero tener una columna en mi GridView que muestre Order.Address.City. He intentado agregar un campo enlazado con "Address.City" como campo de datos a GridView, pero da como resultado un error de tiempo de ejecución ("no such property ...").

Respuesta

43

OK, mucho demasiadas horas después encontré la solución a mí mismo:

Opción 1:

Es posible utilizar el seleccione propiedad en el EntityDataSource que permite crear proyecciones arbitrarias de datos de varias entidades relacionadas/tablas de la base de datos (en mi caso: ID de pedido de entidad de orden y ciudad de la entidad de dirección )

Desventaja: utilizando seleccione en EntityDataSource hace imposible usar Insertar, Actualizar y Eliminar en GridView.

Opción 2:

El EntityDataSource debe tener la incluyen propiedad de incluir la propiedad de dirección relacionada con las órdenes consultados. El marcado mira gustos esto:

<asp:EntityDataSource ID="EntityDataSourceOrders" runat="server" 
    ConnectionString="name=MyEntitiesContext" 
    DefaultContainerName="MyEntitiesContext" 
    EntitySetName="Order" Include="Address" 
    EnableDelete="True" EnableInsert="True" 
    EnableUpdate="True"> 
</asp:EntityDataSource> 

A continuación, la colección columnas de GridView puede tener un campo de la plantilla de esta manera:

<asp:TemplateField HeaderText="City" > 
    <ItemTemplate> 
    <asp:Label ID="LabelCity" runat="server" Text='<%# Eval("Address.City") %>'> 
    </asp:Label> 
    </ItemTemplate> 
</asp:TemplateField> 

Aquí Eval es importante. Enlazar no funciona. También el uso de un BoundField como una columna ...

<asp:BoundField DataField="Address.City" HeaderText="City" /> 

... es NO posible. Por lo tanto, no es posible editar la ciudad en GridView (lo cual tiene sentido porque es un campo relacionado que pertenece a otra tabla y quizás a muchas otras órdenes). Pero es posible editar campos planos de la entidad de pedido y también el "Id. De dirección" de la orden para asignar otra dirección.

+0

Estaba haciendo un proyecto de ejemplo esta noche; esta respuesta fue muy útil al intentar configurar una construcción similar. Gracias. –

+7

Ojalá pudiera hacer +1 en esta respuesta cada vez que vuelva a esta pregunta, especialmente si "usar un BoundField como columna ... NO es posible". –

Cuestiones relacionadas