Procedimiento para asignar relaciones de base de datosHow to: Map Database Relationships

Puede codificar como referencias de propiedad en la clase de entidad cualquier relación de datos que vaya a ser siempre la misma.You can encode as property references in your entity class any data relationships that will always be the same. En la base de datos de ejemplo Northwind, por ejemplo, dado que los clientes normalmente realizan pedidos, hay siempre una relación en el modelo entre los clientes y sus pedidos.In the Northwind sample database, for example, because customers typically place orders, there is always a relationship in the model between customers and their orders.

LINQ to SQLLINQ to SQLdefine un AssociationAttribute atributo para ayudar a representar tales relaciones.defines an AssociationAttribute attribute to help represent such relationships. Este atributo se utiliza junto con los tipos EntitySet<TEntity> y EntityRef<TEntity> para representar lo que sería una relación de clave externa en una base de datos.This attribute is used together with the EntitySet<TEntity> and EntityRef<TEntity> types to represent what would be a foreign key relationship in a database. Para obtener más información, vea la sección relativa al atributo de Asociación de asignación basada en atributos.For more information, see the Association Attribute section of Attribute-Based Mapping.

Nota

Los valores de propiedad AssociationAttribute y ColumnAttribute Storage distinguen entre mayúsculas y minúsculas.AssociationAttribute and ColumnAttribute Storage property values are case sensitive. Por ejemplo, asegúrese de que los valores utilizados en el atributo de la propiedad AssociationAttribute.Storage coinciden con el uso de mayúsculas y minúsculas para los nombres de propiedad correspondientes del resto del código.For example, ensure that values used in the attribute for the AssociationAttribute.Storage property match the case for the corresponding property names used elsewhere in the code. Esto se aplica a todos los lenguajes de programación de .NET, incluso aquellos que normalmente no distinguen mayúsculas de minúsculas, incluido Visual Basic.This applies to all .NET programming languages, even those which are not typically case sensitive, including Visual Basic. Para obtener más información acerca de la propiedad Storage, vea DataAttribute.Storage.For more information about the Storage property, see DataAttribute.Storage.

La mayoría de las relaciones son de uno a varios, como en el ejemplo que se incluye más adelante en este tema.Most relationships are one-to-many, as in the example later in this topic. También puede representar relaciones uno a uno y varios a varios de la manera siguiente:You can also represent one-to-one and many-to-many relationships as follows:

  • Uno a uno: Representar este tipo de relación mediante la EntitySet<TEntity> inclusión de en ambos lados.One-to-one: Represent this kind of relationship by including EntitySet<TEntity> on both sides.

    Por ejemplo, considere una Customer - SecurityCode relación creada para que el código de seguridad del cliente no se encuentre en la Customer tabla y solo personas autorizadas puedan acceder a él.For example, consider a Customer-SecurityCode relationship, created so that the customer's security code will not be found in the Customer table and can be accessed only by authorized persons.

  • Varios a varios: En las relaciones de varios a varios, la clave principal de la tabla de vínculos (también denominada tabla de Unión ) suele estar formada por un compuesto de las claves externas de las otras dos tablas.Many-to-many: In many-to-many relationships, the primary key of the link table (also named the junction table) is often formed by a composite of the foreign keys from the other two tables.

    Por ejemplo, considere una Employee - Project relación de varios a varios formada por el uso de la EmployeeProjecttabla de vínculos.For example, consider an Employee-Project many-to-many relationship formed by using link table EmployeeProject. LINQ to SQLLINQ to SQL requiere que tal relación se modele utilizando tres clases: Employee, Project y EmployeeProject.requires that such a relationship be modeled by using three classes: Employee, Project, and EmployeeProject. En este caso, al cambiar la relación entre Employee y Project puede parecer necesario actualizar la clave principal de EmployeeProject.In this case, changing the relationship between an Employee and a Project can appear to require an update of the primary key EmployeeProject. Sin embargo, esta situación se modela mejor eliminando un EmployeeProject existente y creando un nuevo EmployeeProject.However, this situation is best modeled as deleting an existing EmployeeProject and the creating a new EmployeeProject.

    Nota

    Las relaciones en las bases de datos relacionales se modelan normalmente como valores de clave externa que hacen referencia a claves principales de otras tablas.Relationships in relational databases are typically modeled as foreign key values that refer to primary keys in other tables. Para navegar entre ellos, asocie explícitamente las dos tablas mediante una operación de combinación relacional.To navigate between them you explicitly associate the two tables by using a relational join operation.

    Los objetos LINQ to SQLLINQ to SQLde, por otro lado, se refieren entre sí mediante referencias de propiedad o colecciones de referencias que se navegan mediante la notación de puntos .Objects in LINQ to SQLLINQ to SQL, on the other hand, refer to each other by using property references or collections of references that you navigate by using dot notation.

EjemploExample

En el siguiente ejemplo de relación uno a varios, la clase Customer tiene una propiedad que declara la relación entre los clientes y sus pedidos.In the following one-to-many example, the Customer class has a property that declares the relationship between customers and their orders. La propiedad Orders es de tipo EntitySet<TEntity>.The Orders property is of type EntitySet<TEntity>. Este tipo indica que esta relación es de uno a varios (entre un cliente y varios pedidos).This type signifies that this relationship is one-to-many (one customer to many orders). La propiedad OtherKey se utiliza para describir cómo se logra esta asociación, a saber, especificando el nombre de la propiedad de la clase relacionada que se va a comparar con ésta.The OtherKey property is used to describe how this association is accomplished, namely, by specifying the name of the property in the related class to be compared with this one. En este ejemplo, se CustomerID compara la propiedad, de la misma forma que una combinación de base de datos compararía ese valor de columna.In this example, the CustomerID property is compared, just as a database join would compare that column value.

Nota

Si usa Visual Studio, puede usar la Object Relational Designer para crear una asociación entre clases.If you are using Visual Studio, you can use the Object Relational Designer to create an association between classes.

[Table(Name = "Customers")]
public partial class Customer
{
    [Column(IsPrimaryKey = true)]
    public string CustomerID;
    // ...
    private EntitySet<Order> _Orders;
    [Association(Storage = "_Orders", OtherKey = "CustomerID")]
    public EntitySet<Order> Orders
    {
        get { return this._Orders; }
        set { this._Orders.Assign(value); }
    }
}
<Table(Name:="Customers")> _
Public Class Customer
    <Column(IsPrimaryKey:=True)> _
Public CustomerID As String
    ' ...
    Private _Orders As EntitySet(Of Order)
    <Association(Storage:="_Orders", OtherKey:="CustomerID")> _
    Public Property Orders() As EntitySet(Of Order)
        Get
            Return Me._Orders
        End Get
        Set(ByVal value As EntitySet(Of Order))
            Me._Orders.Assign(value)
        End Set
    End Property
End Class

EjemploExample

También puede invertir la situación.You can also reverse the situation. En lugar de utilizar la clase Customer para describir la asociación entre los clientes y los pedidos, puede utilizar la clase Order.Instead of using the Customer class to describe the association between customers and orders, you can use the Order class. La clase Order utiliza el tipo EntityRef<TEntity> para describir paso a paso la relación hasta el cliente, como se observa en el ejemplo de código siguiente.The Order class uses the EntityRef<TEntity> type to describe the relationship back to the customer, as in the following code example.

Nota

La EntityRef<TEntity> clase admite la carga diferida.The EntityRef<TEntity> class supports deferred loading. Para obtener más información, vea carga aplazada frente a carga inmediata.For more information, see Deferred versus Immediate Loading.

[Table(Name = "Orders")]
public class Order
{
    [Column(IsPrimaryKey = true)]
    public int OrderID;
    [Column]
    public string CustomerID;
    private EntityRef<Customer> _Customer;
    [Association(Storage = "_Customer", ThisKey = "CustomerID")]
    public Customer Customer
    {
        get { return this._Customer.Entity; }
        set { this._Customer.Entity = value; }
    }
}
<Table(Name:="Orders")> _
Public Class Order
    <Column(IsPrimaryKey:=True)> _
    Public OrderID As Integer
    <Column()> _
    Public CustomerID As String
    Private _Customer As EntityRef(Of Customer)
    <Association(Storage:="Customer", ThisKey:="CustomerID")> _
    Public Property Customer() As Customer
        Get
            Return Me._Customer.Entity
        End Get
        Set(ByVal value As Customer)
            Me._Customer.Entity = value
        End Set
    End Property
End Class

Vea tambiénSee also