Relational Order Tables in C#

Asked

Viewed 535 times

-1

Good morning Guys, I am developing an order screen where will be added products to compose the request, but I can not imagine a way to save the order items in a table, how could relate the product registration table with the request table ?

I am using sql server and am programming in C# in visual studio

  • You can add your products to a DataGridView or ListView, then through the Rows collect data for storage.

1 answer

1


The first thing to do, is 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 the tables, you need to create a relationship of 1:N amid Pedido and PedidoProduto and N:1 amid PedidoProduto and Produto. In practice it will be a relationship of N:M amid 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

And of course, don’t forget to create the indexes for FK (although it’s 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#, then 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 a ORM to enter the data, I advise you to use the Dapper and Dapper.Contrib: Install-Package Dapper and Install-Package Dapper.Contrib, and in this case specifically, since the Key is a Guid, use the RT.Comb: Install-Package RT.Comb

below is 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, in case I wanted to perform a consultation.:

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();
}
  • thank you very much Tobias

Browser other questions tagged

You are not signed in. Login or sign up in order to post.