visual studio net mvc instalar framework first español data asp asp.net gridview ado.net-entity-data-model

asp.net - studio - entity framework database first español



Columnas de dos tablas de bases de datos relacionadas en un ASP.NET GridView con EntityDataSource (1)

Tengo dos tablas de SQL Server con claves principales (PK) y una clave externa (FK) que vinculan las dos tablas:

1) Table "Order" OrderID, int, PK AddressID, int, FK ... 2) Table "Address" AddressID, int, PK City, nvarchar(50) ...

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

  • Solicitar ID
  • Ciudad (perteneciente a ese orden y enlazada por la clave AddressID)

¿Cómo puedo hacer eso? Mi problema es: cuando configuro la Fuente de Datos de la Entidad, puedo seleccionar un "EntitySetName" que puede ser "Orden" o "Dirección" pero no ambos, ni puedo seleccionar ningún tipo de relación. Si selecciono "Orden" como EntitySetName, en el GridView puedo agregar las columnas

  • Solicitar ID
  • Dirección
  • Address.AddressID

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

¡Gracias por la ayuda de antemano!

Editar: Aclaración:

El Entity Framework ha creado una clase "Orden" y una clase "Dirección" correspondiente a las tablas de la base de datos. La clase "Orden" tiene una referencia a un objeto "Dirección" como una propiedad de navegación, correspondiente a la relación 1-n entre la tabla de 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 existe esa propiedad ...").


OK, demasiadas horas después encontré la solución yo mismo:

Opción 1:

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

Inconveniente: ¡Usar la selección en EntityDataSource hace imposible el uso de Insertar, Actualizar y Eliminar en el GridView!

Opcion 2:

El EntityDataSource debe tener la propiedad include para incluir la propiedad de dirección relacionada junto con los pedidos consultados. El marcado se ve así:

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

Luego, la colección de columnas de GridView puede tener un campo de plantilla como este:

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

Aquí Eval es importante. El enlace no funciona. También utilizando un BoundField como una columna ...

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

... NO es posible. Por lo tanto, GridView no puede editar la ciudad (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 orden y también el "AddressID" de la orden para asignar otra dirección.