none
ERRO DE multiplicity of relationship RRS feed

  • Pergunta

  • Prezados,

    Estou com o seguinte erro:

    entity A constraint violation occurred multiplicity of relationship: An EntityReference can have no more than one related object, but the query returned more than one related object.

    Este erro ocorre quando executo o Linq

    var vendaitens = (from v in ctx.VendaItem where v.Venda.Id == IdVenda select v).ToList();

    Ao acessar a propriedade Produto.Id por ex.  o erro ocorre...

    Vejam como foi feito o mapeamento...


    André Perpetuo

    terça-feira, 21 de janeiro de 2014 20:32

Respostas

  • Alterei o mapeamento conforme colocou e adicionei a navigation property VendaItem em produto e mesmo assim ainda persisti.

    Eu limpei as tabelas venda e VendaItem e Inseri uma venda de um determinado produto e quando executo:

    var vendaitens = (from v in ctx.VendaItem where v.Venda.Id == IdVenda select v).ToList()...

    Funciona perfeitamente!

    Quando realizo outra venda para o mesmo produto o erro ocorre.....


    André Perpetuo

    Coloque o código da inserção nessa entidade?
    Coloque uma imagem da sua tabela ?

    Fulvio Cezar Canducci Dias

    • Marcado como Resposta André Perpetuo quarta-feira, 22 de janeiro de 2014 19:53
    quarta-feira, 22 de janeiro de 2014 18:30

Todas as Respostas

  • Ta estranho neh?!

    Olha só

    Venda tem a Chave Primaria "Id"  e mais um campo Codigo Venda ?

    Ai

    VendaItem tem Chave Primaria "Id", idItem que acho eu deve relacionar com Produto ??? e 

    Produto tem a Chave Primaria "Id" ????

    Eu vi isso, mas, se pode me explicar porque no meu entender

    seria!!!!

    Venda -> Id (Primary Key)

    VendaItem -> Id (Primary Key), VendaId (Forekeing Key (da Primary Key Venda (Id)) e ProdutoId mesma lógica !!!

    Bom se poderia verificar e me falar?



    Fulvio Cezar Canducci Dias

    terça-feira, 21 de janeiro de 2014 21:27
  • Caro Cezar,

    Na entidade Venda a chave é o Id... O CodigoVenda não compõem a chave!

    VendaItem Possui apenas a PK Id e FK Venda e Produto

    E o produto possui apenas o Id como chave.

    Veja Código SQL que o EF está gerando para essas entidades.

    CREATE TABLE [dbo].[Venda] (
        [Id] uniqueidentifier  NOT NULL,
        [QuantidadeParcelas] smallint  NOT NULL,
        [PrimeiraParcelaDias] smallint  NOT NULL,
        [IntervaloParcelas] smallint  NOT NULL,
        [DataCriacao] datetime  NOT NULL,
        [DataVenda] datetime  NOT NULL,
        [ValorTotalSemDesconto] decimal(18,2)  NOT NULL,
        [ValorTotalComDesconto] decimal(18,2)  NOT NULL,
        [DescricaoPagamento] nchar(40)  NULL,
        [DiaVencimento] smallint  NULL,
        [Status] nvarchar(max)  NULL,
        [OrigemVenda] nvarchar(max)  NULL,
        [Dominio] uniqueidentifier  NOT NULL,
        [Empresa] uniqueidentifier  NOT NULL,
        [CodigoVenda] nvarchar(12)  NOT NULL,
        [Vendedor_Id] uniqueidentifier  NULL,
        [Cliente_Id] uniqueidentifier  NULL,
        [CondicaoPagamento_Id] uniqueidentifier  NOT NULL,
        [Usuario_Id] uniqueidentifier  NOT NULL,
        [TipoPagamento_Id] uniqueidentifier  NOT NULL
    );

    CREATE TABLE [dbo].[VendaItem] (
        [Id] uniqueidentifier  NOT NULL,
        [idItem] int  NULL,
        [Valor] decimal(18,2)  NULL,
        [Status] nchar(2)  NULL,
        [Quantidade] int  NOT NULL,
        [ValorVendido] decimal(18,2)  NULL,
        [Produto_Id] uniqueidentifier  NOT NULL,
        [Venda_Id] uniqueidentifier  NOT NULL
    );

    CREATE TABLE [dbo].[Produto] (
        [Id] uniqueidentifier  NOT NULL,
        [DescricaoResumida] nvarchar(120)  NOT NULL,
        [DescricaoDetalhada] nvarchar(800)  NULL,
        [Tags] nvarchar(100)  NULL,
        [QuantidadeEstoque] int  NOT NULL,
        [PrecoCusto] decimal(18,2)  NULL,
        [PrecoVenda] decimal(18,2)  NOT NULL,
        [CodReferencia] nchar(20)  NULL,
        [CodigoReferenciaFabricante] nvarchar(20)  NULL,
        [CodigoBarras] nvarchar(80)  NULL,
        [Marca] nvarchar(30)  NULL,
        [CodigoInterno] nvarchar(8)  NULL,
        [Dominio] uniqueidentifier  NOT NULL,
        [Empresa] uniqueidentifier  NOT NULL,
        [Ativo] bit  NOT NULL,
        [Categoria_Id] uniqueidentifier  NOT NULL,
        [Fornecedor_Id] uniqueidentifier  NULL
    );

    Não consigo ver o que está errado....


    André Perpetuo

    quarta-feira, 22 de janeiro de 2014 09:43
  • Mais um detalhe.

    O problema só ocorre quando tenho o mesmo produto mais de uma vez na tabela VendaItem...


    André Perpetuo

    quarta-feira, 22 de janeiro de 2014 10:22
  • Relacionamento de Banco Proposto!

    Perceba que Produto tem um relacionamento com o VendaItem que o seu não tem !!! Ou seja, na Entidade Produto não tem a Collection VendaItem como tem no meu exemplo ... eu reproduzi as tabelas coloque as chaves e relacionamentos conforme a lógico vista, e no meu caso rodou perfeitamente! Dá uma olhada no relacionamento entre as Tabelas VendaItem e Produto e por favor verifique se as chave primaria corresponde ao relacionamento nas tabelas com suas chaves estrangeiras !!! Outro fator não duplique de mandeira nenhuma dois produtos na tabela de VendaItem se o cara digitar de novo some mais os produtos a que já tem ou então avise o usuário com uma mensagem, porque, esse fator pode também contribuir a esses erros

    Dica: perguntei a especialistas de banco para identifica (eu mesmo sempre fiz assim) use BigInt ou Int com Identity é a melhor forma de identificar um registro ... mas, é uma dica porque dessa forma fica incomodo os relacionamentos!!!


    Fulvio Cezar Canducci Dias

    quarta-feira, 22 de janeiro de 2014 13:21
  • Alterei o mapeamento conforme colocou e adicionei a navigation property VendaItem em produto e mesmo assim ainda persisti.

    Eu limpei as tabelas venda e VendaItem e Inseri uma venda de um determinado produto e quando executo:

    var vendaitens = (from v in ctx.VendaItem where v.Venda.Id == IdVenda select v).ToList()...

    Funciona perfeitamente!

    Quando realizo outra venda para o mesmo produto o erro ocorre.....


    André Perpetuo

    quarta-feira, 22 de janeiro de 2014 18:29
  • Alterei o mapeamento conforme colocou e adicionei a navigation property VendaItem em produto e mesmo assim ainda persisti.

    Eu limpei as tabelas venda e VendaItem e Inseri uma venda de um determinado produto e quando executo:

    var vendaitens = (from v in ctx.VendaItem where v.Venda.Id == IdVenda select v).ToList()...

    Funciona perfeitamente!

    Quando realizo outra venda para o mesmo produto o erro ocorre.....


    André Perpetuo

    Coloque o código da inserção nessa entidade?
    Coloque uma imagem da sua tabela ?

    Fulvio Cezar Canducci Dias

    • Marcado como Resposta André Perpetuo quarta-feira, 22 de janeiro de 2014 19:53
    quarta-feira, 22 de janeiro de 2014 18:30
  • Resolvido!!!!

    Quando fui analisar a tabela para lhe enviar o print de cara vi que o Id em vendaItem estava identicos....

    Este banco foi criado pelo CreateDatabase do Entity e por algum motivo as pks e fks não foram criadas!


    André Perpetuo

    quarta-feira, 22 de janeiro de 2014 19:53
  • Correto!

    Fulvio Cezar Canducci Dias

    quarta-feira, 22 de janeiro de 2014 20:05