LINQ para iniciantes 4 - Como criar relacionamentos 1-1 e 1-muitos

watch_later 2 de jul de 2013

Como criarmos um exemplo simples para os relacionamentos 1-1 e 1-muitos?

LINQ ajuda a definir relacionamentos usando EntitySet e EntityRef. Para entender como podemos definir relacionamentos usando LINQ, vamos considerar o exemplo abaixo, onde temos um cliente que pode ter vários endereços e cada endereço terá detalhes de telefone. Em outras palavras, o cliente e o endereço tem uma relação de um para muitos, enquanto o endereço de telefone e tem uma relação de um para um.
Para definir um 1-muitos entre as classes de endereços do cliente e, é preciso usar o atributo EntitySet. Para definir 1 para 1 entre o endereço e telefone, é preciso usar o atributo EntityRef.
Nota: Você precisa definir um atributo de chave primária para cada classe de entidade ou qualquer outra relação de mapeamento não irá funcionar. Abaixo está o trecho entidade-classe para a classe cliente que mostra como usar EntitySet para definir um relacionamento 1-muitos com a classe de endereço. A associação é definida usando o atributo Association. O atributo Association tem três propriedades importantes para armazenamento, ThisKey e OtherKey. definem o nome da variável privada onde o objeto endereço é armazenado, atualmente, é _CustomerAddresses. ThisKey e OtherKey que definem as quais propriedades irão definir a ligação, pois neste caso, é CustomerId Em outras palavras, tanto a classe do cliente e o endereço de classe terão a propriedade CustomerId em comum. ThisKey define o nome da propriedade para a classe cliente enquanto OtherKey define a propriedade da classe de endereço.
        
        
[Table(Name = "Customer")]
public class clsCustomerWithAddresses
{
    private EntitySet<clsAddresses> _CustomerAddresses;

    [Association(Storage = "_CustomerAddresses",
      ThisKey="CustomerId", OtherKey = "CustomerId")]
    public EntitySet<clsAddresses> Addresses
    {
        set
        {
            _CustomerAddresses = value;
        }
        get
        {
            return _CustomerAddresses;
        }
    }
}
        
    
Abaixo está o trecho de código completo, com outras propriedades da classe cliente:
        
        
[Table(Name = "Customer")]
public class clsCustomerWithAddresses
{
    private int _CustomerId;
    private string _CustomerCode;
    private string _CustomerName;
    private EntitySet<clsAddresses> _CustomerAddresses;

    [Column(DbType="int",IsPrimaryKey=true)]
    public int CustomerId
    {
        set
        {
            _CustomerId = value;
        }
        get
        {
            return _CustomerId;
        }
    }

    [Column(DbType = "nvarchar(50)")]
    public string CustomerCode
    {
        set
        {
            _CustomerCode = value;
        }
        get
        {
            return _CustomerCode;
        }
    }

    [Column(DbType = "nvarchar(50)")]
    public string CustomerName
    {
        set
        {
            _CustomerName = value;
        }
        get
        {
            return _CustomerName;
        }
    }

    [Association(Storage = "_CustomerAddresses",ThisKey="CustomerId", OtherKey = "CustomerId")]
    public EntitySet<clsAddresses> Addresses
    {
        set
        {
            _CustomerAddresses = value;
        }
        get
        {
            return _CustomerAddresses;
        }
    }
}
        
    
Para definir a relação entre a classe de endereço e telefone, nós precisamos usar a sintaxe EntityRef. Abaixo está o trecho de código que define a relação com EntityRef. Todas as outras propriedades são as mesmas, exceto que precisamos definir a variável usando EntityRef.
        
        
public class clsAddresses
{
    private int _AddressId;
    private EntityRef<clsPhone> _Phone;

    [Column(DbType = "int", IsPrimaryKey = true)]
    public int AddressId
    {
        set
        {
            _AddressId = value;
        }
        get
        {
            return _AddressId;
        }
    }
    [Association(Storage = "_Phone", 
    ThisKey = "AddressId", OtherKey = "AddressId")]
    public clsPhone Phone
    {
        set
        {
            _Phone.Entity = value;
        }
        get
        {
            return _Phone.Entity;
        }
    }
}
        
    
Abaixo está a classe de endereço completo com outras propriedades:
        
        
public class clsAddresses
{
    private int _Customerid;
    private int _AddressId;
    private string _Address1;
    private EntityRef<clsPhone> _Phone;
    [Column(DbType="int")]
    public int CustomerId
    {
        set
        {
            _Customerid = value;
        }
        get
        {
            return _Customerid;
        }
    }
    [Column(DbType = "int", IsPrimaryKey = true)]
    public int AddressId
    {
        set
        {
            _AddressId = value;
        }
        get
        {
            return _AddressId;
        }
    }
    [Column(DbType = "nvarchar(50)")]
    public string Address1
    {
        set
        {
            _Address1 = value;
        }
        get
        {
            return _Address1;
        }
    }
    [Association(Storage = "_Phone", 
    ThisKey = "AddressId", OtherKey = "AddressId")]
    public clsPhone Phone
    {
        set
        {
            _Phone.Entity = value;
        }
        get
        {
            return _Phone.Entity;
        }
    }
}
        
    
Aqui é a classe de telefone que foi agregada com a classe de endereço:
        
        
[Table(Name = "Phone")]
public class clsPhone
{
    private int _PhoneId;
    private int _AddressId;
    private string _MobilePhone;
    private string _LandLine;

    [Column(DbType = "int", IsPrimaryKey = true)]
    public int PhoneId
    {
        set
        {
            _PhoneId = value;
        }
        get
        {
            return _PhoneId;
        }
    }

    [Column(DbType = "int")]
    public int AddressId
    {
        set
        {
            _PhoneId = value;
        }
        get
        {
            return _PhoneId;
        }
    }

    [Column(DbType = "nvarchar")]
    public string MobilePhone
    {
        set
        {
            _MobilePhone = value;
        }
        get
        {
            return _MobilePhone;
        }
    }

    [Column(DbType = "nvarchar")]
    public string LandLine
    {
        set
        {
            _LandLine = value;
        }
        get
        {
            return _LandLine;
        }
    }
}        
    
Agora, finalmente, é preciso consumir essa relação em nossa ASPX client no code-behind.
O primeiro passo é o de criar o objecto DataContext com a ligação inicializado.
        
        
DataContext objContext = new DataContext(strConnectionString);
                    
    
O segundo passo é acionar a consulta. Por favor, note que estamos apenas dispararando a consulta para a classe cliente. O LINQ assegura que todos os quadros de dados filhos é extraído e colocada como por relações definidas nas classes de entidade ..
        
        
var MyQuery = from objCustomer in objContext.GetTable<clsCustomerWithAddresses>()
select objCustomer;
                    
    
Finalmente, percorrer o cliente, percorrer o objeto endereços correspondente e exibir detalhes de telefone conforme o objeto telefone.
        
        
foreach (clsCustomerWithAddresses objCustomer in MyQuery)
{
    Response.Write(objCustomer.CustomerName + "<br>");
    foreach (clsAddresses objAddress in objCustomer.Addresses)
    {
        Response.Write("===Address:- " + objAddress.Address1 + "<br>");
        Response.Write("========Mobile:- " + objAddress.Phone.MobilePhone + "<br>");
        Response.Write("========LandLine:- " + objAddress.Phone.LandLine + "<br>");
    }
}
        
    
A saída é algo como mostrado abaixo. Cada cliente tem vários endereços e cada endereço tem um objeto telefone.
Bom galera , ficamos por aqui a abaixo estão os links das postagens da mesma série , espero que seja útil ,qualquer dúvida comente , ou mande email para contato@virtualbase.com.br

Lista de Postagens da série LINQ PARA INICIANTES :