Relational Tables of Orders in C #

-1

Good morning, I'm developing a request screen where products will be added to the request, but I can not imagine a way to save the order items to a table, how could I relate the product registration table to the table of the requisition?

I'm using the sql server and I'm programming in C # in visual studio

    
asked by anonymous 15.04.2018 / 16:46

1 answer

1

The first thing to do is to create the tables, in case you would have the tables Produto , Pedido and the relationship table PedidoProduto .

CREATE TABLE dbo.Produtos (
    ProdutoId uniqueidentifier NOT NULL rowguidcol default newsequentialid(),
    Descricao varchar(50) NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Produtos ADD CONSTRAINT PK_Produtos PRIMARY KEY CLUSTERED (ProdutoId) ON [PRIMARY]
GO

CREATE TABLE dbo.Pedidos (
    PedidoId uniqueidentifier NOT NULL rowguidcol default newsequentialid(),
    Descricao varchar(50) NOT NULL
)  ON [PRIMARY]
GO
ALTER TABLE dbo.Pedidos ADD CONSTRAINT PK_Pedidos PRIMARY KEY CLUSTERED (PedidoId) ON [PRIMARY]

GO

CREATE TABLE dbo.PedidoProdutos (
    PedidoProdutoLinkId uniqueidentifier NOT NULL rowguidcol default newsequentialid(),
    PedidoId uniqueidentifier NOT NULL,
    ProdutoId uniqueidentifier NOT NULL,
    Quantidade decimal(10, 2) NOT NULL
)  ON [PRIMARY]
GO
ALTER TABLE dbo.PedidoProdutos ADD CONSTRAINT PK_PedidoProdutos PRIMARY KEY CLUSTERED (PedidoProdutoLinkId) ON [PRIMARY]
GO

At this time there is no relationship between tables, you need to create a relationship of 1:N between Pedido and PedidoProduto and N:1 between PedidoProduto and Produto . In practice it will be a N:M relationship between Produto and Pedido .

ALTER TABLE dbo.PedidoProdutos ADD CONSTRAINT FK_PedidoProdutos_Pedidos 
FOREIGN KEY (PedidoId) REFERENCES dbo.Pedidos (PedidoId) 
ON UPDATE NO ACTION 
ON DELETE  NO ACTION
GO

ALTER TABLE dbo.PedidoProdutos ADD CONSTRAINT FK_PedidoProdutos_Produtos 
FOREIGN KEY (ProdutoId) REFERENCES dbo.Produtos (ProdutoId) 
ON UPDATE  NO ACTION 
ON DELETE  NO ACTION    
GO

Of course, do not forget to create the indexes for the FK (although it is not mandatory).

CREATE NONCLUSTERED INDEX IX_PedidoProdutos_ProdutoId ON dbo.PedidoProdutos(ProdutoId) ON [PRIMARY]
GO
CREATE UNIQUE NONCLUSTERED INDEX IX_PedidoProdutos_PedidoId_ProdutoId ON dbo.PedidoProdutos(PedidoId, ProdutoId) on [PRIMARY]
GO

Now let's go to C #, so let's model the entities.:

public class Produto
{
    public Guid ProdutoId { get; set; }
    public string Descricao { get; set; }

    public ICollection<PedidoProduto> Pedidos { get; set; }
}

public class Pedido
{
    public Guid PedidoId { get; set; }
    public string Descricao { get; set; }

    public ICollection<PedidoProduto> Produtos { get; set; }
}

public class PedidoProduto
{
    public Guid PedidoProdutoId { get; set; }
    public Guid PedidoId { get; set; }
    public Guid ProdutoId { get; set; }
    public decimal Quantidade { get; set; }

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

If you are not using an ORM to enter the data, I suggest using Dapper and Dapper.Contrib : Install-Package Dapper and Install-Package Dapper.Contrib , and in this case in specific, since the Key is a Guid, use RT.Comb : Install-Package RT.Comb

Here's an example to insert a Product:

var produto = new Produto
{
    ProdutoId = RT.Comb.Provider.Sql.Create(),
    Descricao = "Produto 01"
};

using (var conexao = new SqlConnection("%sua string de conexao%"))
{
    conexao.Open();
    conexao.Insert(produto);
}

Now let's go to Pedido and their respective Produtos

var pedido = new Pedido
{
    PedidoId = RT.Comb.Provider.Sql.Create(),
    Descricao = "Pedido 01",
    Produtos = new List<PedidoProduto>()
};

for (var i = 1, i <= 5, i++)
{
    var produtoId = Guid.Parse("%id do produto aqui%");
    var produto = new PedidoProduto
    {
        PedidoProdutoId = RT.Comb.Provider.Sql.Create(),
        PedidoId = pedido.PedidoId,
        ProdutoId = produtoId,
        Quantidade = i
    };
    pedido.Produtos.Add(produto)
}

using (var conexao = new SqlConnection("%sua string de conexao%"))
{
    conexao.Open();
    using (var tras = conexao.BeginTransaction())
    {
        conexao.Insert(pedido);
        foreach (var produto in pedido.Produtos)
        {
            conexao.Insert(produto);
        }
        tras.Commit();
    }
}

And finally, if you wanted to make a query.:

var pedidoId = Guid.Parse("%id do pedido aqui%");
using (var conexao = new SqlConnection("%sua string de conexao%"))
{
    conexao.Open();
    var pedido = conexao.QueryFirstOrDefault<Pedido>("SELECT * FROM Pedidos WHERE PedidoId = @PedidoId", new { PedidoId = pedidoId });
    pedido.Produtos = conexao.Query<PedidoProduto>("SELECT * FROM PedidoProdutos WHERE PedidoId = @PedidoId", new { PedidoId = pedidoId }).ToList();
}
    
17.04.2018 / 15:23