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.

6 thoughts on “ADO.NET Entity Framework y llaves foráneas”

  1. Hola que tal….

    Una pregunta… tengo ese problema pero el detalle es que estoy usando un SP, el cual pss regresa los datos de la entidad digamos producto, y cuando me regresa todos los datos la relación categoriaid digamos que es igual a 1 pero cuando carga la entidad que me regresa pss este campo es un objeto y viene vacio…

    Espero haberme explicado saludos…

    mi correo es gerardo.camou@mimoss.com

  2. Hola! Es lo que andaba buscando, buen artículo. Tengo una pregunta, de que otra manera puedo navegar las propiedades de otra clase, pero por ejemplo un objeto que lo que despliega es DataTextValue.

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>