ADO.NET Entity Framework y llaves foráneas

Es algo muy normal trabajar con tablas que están relacionadas con otras por medio de llaves foráneas. Si has usado ADO.NET Framework para hacer algunas operaciones con la BD y para mostrar datos en una página ASP.NET, quizás te hayas encontrado con el dilema de mostrar los campos relacionados de la tabla externa a la que estás mostrando.

Por ejemplo, tomando como ejemplo la clásica base de datos de Northwind, y teniendo las tablas de Products y Categories, y si definimos nuestro modelo de Entidades de esta forma:

modelo

Podemos mostrar en un GridView el contenido de Products haciendo la referencia correspondiente:

        NorthwindModel.NorthwindEntities ne = 
            new NorthwindModel.NorthwindEntities();

        var products = from p in ne.Products
                       select p;

        grdProductos.DataSource = products;
        grdProductos.DataBind();




 grid



Pero ¿qué tal si quiero mostrar en el mismo GridView la descripción de la categoría? Basta incluir en la declaración del campo la propiedad Include para que se pueda cargar ese dato.





        NorthwindModel.NorthwindEntities ne = 
            new NorthwindModel.NorthwindEntities();

        var products = from p in ne.Products
                       .Include("Categories")
                       select p;

        grdProductos.DataSource = products;
        grdProductos.DataBind();


Y con esto tenemos acceso a los campos de la segunda tabla para de esa manera mostrar como fuente de datos de alguna columna del grid algún campo. En este caso, con un Template Field hacemos un Bind usando simplemente Categories.Description que sería la manera de ligar desde Products a ese campo:





    <asp:TemplateField HeaderText="Category">
        <EditItemTemplate>
            <asp:TextBox ID="TextBox1" runat="server" 
                Text='<%# Bind("Categories.Description") %>'>
                </asp:TextBox>
        </EditItemTemplate>
        <ItemTemplate>
            <asp:Label ID="Label1" runat="server" 
                Text='<%# Bind("Categories.Description") %>'>
            </asp:Label>
        </ItemTemplate>
    </asp:TemplateField>




gridconcategoria



Por supuesto que en lugar de esto pudiéramos usar Vistas desde el servidor SQL Server con todos los campos que ocupemos, pero esta sería una de las formas de resolver como mostrar los campos en tablas mediante llaves foráneas usando código de ADO.NET Entity Framework.

Formato de fecha en Gridview

No está de más recordar que cuando tienes un GridView con un campo tipo fecha, puedes definir el formato de la cadena a lo que tú gustes, en lugar de los valores por default de fecha completa:


fechafull


Para definir el formato de salida de la cadena en campos ligados, es sencillo, usando la propiedad DataFormatString:


 


<asp:BoundField DataField="Fecha" DataFormatString="{0:d}" />

 


Pero ¿qué pasa si tenemos TemplateFields, sencillo, usando la misma función Bind donde especificamos en el enlace al campo de datos para agregarle el formato que necesitamos:


 


<asp:TemplateField HeaderText="Fecha">
  <EditItemTemplate>
    <asp:TextBox ID="TextBox1" runat="server" 

             Text='<%# Bind("Fecha","{0:d}") %>'>

    </asp:TextBox>
  </EditItemTemplate>
  <ItemTemplate>
    <asp:Label ID="Label1" runat="server" 

              Text='<%# Bind("Fecha","{0:d}") %>'>

     </asp:Label>
  </ItemTemplate>
</asp:TemplateField>

 


De esta manera podemos mostrar a nuestra conveniencia el formato de los datos que mostramos en un gridview:


fecha