Best way to make class relationship

4

Hello, I would like to know what is the correct way to do relationship between classes of 1..N and 1 ... 1. Example:

public class Pedido
{
    public int PedidoID{get;set;}
    .............
}

public class ItemPedido
{
    public int ItemPedidoID{get;set;}
    public int PedidoId{get;set;}
    public int ProdutoId{get;set;}
    .........
}

public class Produto
{
    public int ProdutoId{get;set;}
    ...........
}
    
asked by anonymous 14.06.2016 / 02:49

2 answers

6

I would model the classes as follows:

public class Pedido
{
    public int Id { get; set; }
    public DateTime Data { get; set; }
    public virtual List<Produto> Produtos { get; set; }
}

public class Produto
{
    public int Id { get; set; }
    public string Nome { get; set; }
}

public class Context : DbContext
{
    public Context() : base("DefaultConnection")
    {
    }
    public DbSet<Pedido> Pedidos { get; set; }
    public DbSet<Produto> Produtos { get; set; }
}

In case I used the virtual for the example, if I was using EF as an ORM, I also changed the RequestId and ProductId to Id, just to stay default.

Remembering that in this example we are showing objects of our application, not in the Data Model (SQL).

If your "OrderItem" in the database has no property (other than the Product Id and the OrderId), you do not need to create an intermediate object in C # called OrderOrder, it makes sense to create this object if your OrderOrder has Quantity for example.

Below is an example of use in a console:

class Program
{
    static void Main(string[] args)
    {
        var context = new Context();

        var produto = new Produto() { Nome = "Produto 1" };
        var produto2 = new Produto() { Nome = "Produto 2" };

        context.Produtos.Add(produto);
        context.Produtos.Add(produto2);
        context.SaveChanges();

        var pedido = new Pedido() { Data = DateTime.Now };
        pedido.Produtos = new List<Produto>();
        pedido.Produtos.Add(produto);
        pedido.Produtos.Add(produto2);

        context.Pedidos.Add(pedido);
        context.SaveChanges();


    }
}
    
14.06.2016 / 03:51
2

The beginning is correct. You must now set the navigation properties for use by the Entity Framework, for example:

public class Pedido
{
    public int PedidoId {get;set;}

    public virtual ICollection<ItemPedido> ItemPedidos { get; set; }
}

public class ItemPedido
{
    public int ItemPedidoId {get;set;}
    public int PedidoId {get;set;}
    public int ProdutoId {get;set;}

    // Acho que aqui deveria vir uma quantidade, certo?
    public int Quantidade { get; set; }

    public virtual Pedido Pedido { get; set; }
    public virtual Produto Produto { get; set; }
}

public class Produto
{
    public int ProdutoId {get;set;}

    public virtual ICollection<ItemPedido> ItemPedidos { get; set; }
}

Here there are no cases 1..0-1. Only 1..N and N..1, so I will invent a case 1..0-1.

Suppose your Pedido has a PedidoEnderecoEntrega . It may exist or not (that is, 0 or 1 record). The modeling would look like this:

public class PedidoEnderecoEntrega
{
    [Key, ForeignKey("Pedido")]
    public int PedidoId { get; set; } // É PedidoId mesmo. A chave primária também é estrangeira.

    ...
    public virtual Pedido Pedido { get; set; }
}

Pedido would look like this:

public class Pedido
{
    public int PedidoId {get; set;}

    public virtual ICollection<ItemPedido> ItemPedidos { get; set; }
    public virtual PedidoEnderecoEntrega PedidoEnderecoEntrega { get; set; }
}
    
14.06.2016 / 04:29