ADO.NET Entity Framework y llaves foráneas - ponte

ADO.NET Entity Framework y llaves foráneas

Published Thu, Apr 30 2009 9:37

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.

Filed under: , , ,

Comments

# Carlos Orellana said on Friday, August 28, 2009 5:56 PM

Para evitar el paso bind en el grid poner en el select:

select new { p.ProductName, p.Categories.CategoryName };

Muy buen Articulo.

# Gabriel Flores said on Saturday, August 29, 2009 8:32 AM

Muchas gracias por tu aportación Carlos.

# zizou said on Wednesday, December 23, 2009 4:31 PM

muy buen articulo era justo lo que estaba buscando

# Jose Maldonado said on Friday, January 15, 2010 6:02 AM

tres horas rebuscando en el libro de EF, otras tantas en San Google y por fín lo encontré. Un millón de gracias por la aportación!

# Gerardo Camou said on Friday, February 12, 2010 1:17 PM

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

# Miguel said on Thursday, July 29, 2010 12:39 PM

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 Comment

(required) 
(required) 
(optional)
(required) 
If you can't read this number refresh your screen
Enter the numbers above: