ENTITY FRAMEWORK SALVANDO REGISTRO EM BRANCO

 Tópico anterior Próximo tópico Novo tópico

ENTITY FRAMEWORK SALVANDO REGISTRO EM BRANCO

C#

 Compartilhe  Compartilhe  Compartilhe
#477265 - 19/10/2017 19:50:21

MRSILVA
MARINGA
Cadast. em:Julho/2015


Olá.
Preciso de uma ajuda para resolver um problema na gravação de registro entre tabelas relacionadas, tenho um relacionamento de um para um mapeado através do Entity Framework, mas quando salvo no banco de dados está sendo criado um registro correto e um em branco na tabela Pessoa.

Modelo:

  {
[Table("Pessoa")]
public class Pessoa : EntityBase {

    }




    [DisplayName(displayName: "nome")]
    [DataObjectField(primaryKey: false, isIdentity: false, isNullable: true)]
    [StringLength(maximumLength: 80)]
    public string nome { get; set; }

    [DisplayName(displayName: "NomeFantasia")]
    [DataObjectField(primaryKey: false, isIdentity: false, isNullable: true)]
    [StringLength(maximumLength: 80)]
    public string nomeFantasia { get; set; }


    [DisplayName(displayName: "Tipo")]
    [DataObjectField(primaryKey: false, isIdentity: false, isNullable: false)]
    public int tipoPessoa { get; set; }




}
}


[Table("Fornecedor")]
public class Fornecedor : Pessoa
{

    public Fornecedor()
    {

    // this.pessoa = new Pessoa();
    }


    [Browsable(false)]
    [DataObjectField(false, true, false)]

    [ForeignKey("pessoa")]
    [Index(IsUnique = true)]
    public int IdPessoa { get; set; }
    public virtual Pessoa pessoa { get; set; }

    [DisplayName(displayName: "CNPJ/CPF")]
    [DataObjectField(primaryKey: false, isIdentity: false, isNullable: true)]
    [StringLength(maximumLength: 14)]
    public string inscricaoFed { get; set; }

    [DisplayName(displayName: "Inscricão estadual")]
    [DataObjectField(primaryKey: false, isIdentity: false, isNullable: true)]
    [StringLength(maximumLength: 14)]
    public string inscricaoEst { get; set; }



Estou salvando da seguinte forma:

public void AdicionaFornecedor(Fornecedor fornecedor, int idPessoa)
    {

        fornecedor.IdPessoa = idPessoa;
        Db.Fornecedor.Add(fornecedor);
        SalvarBd();
    }  


Por favor alguém poderia me ajudar como corrigir isso. Desde já agradeço.



Resposta escolhida #477266 - 19/10/2017 20:14:51

JABA
CABO FRIO
Cadast. em:Agosto/2005


Sinceramente, não sei como o Entity está trabalhando com herança atualmente, mas acho que a propriedade "IdPessoa" teria que ir na classe Pessoa.


_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem quando o corpo está em movimento?



#477267 - 19/10/2017 21:03:07

MRSILVA
MARINGA
Cadast. em:Julho/2015


Jabá Obrigado pelo ajuda.

Esqueci de postar que a chave primaria da classe pessoa é herdada da classe EntityBase.

Quanto a chaves acredito que esteja correto já que o banco de dados é criado corretamente com os devidos relacionamentos.

Somente quando vou gravar um objeto fornecedor que cria um registro na tabela pessoa com id e o restante dos campos como null.



#477268 - 19/10/2017 22:14:20

JABA
CABO FRIO
Cadast. em:Agosto/2005


Última edição em 19/10/2017 23:27:00 por JABA

Citação:
[ForeignKey("pessoa")]
    [Index(IsUnique = true)]
    public int IdPessoa { get; set; }


Mas você está declarando ele como uma chave estrangeira na classe "Fornecedor", pode ser que esteja dando conflito aí.  Retire isso e trabalhe com a chave primária da classe base EntityBase.  

Citação:
public virtual Pessoa pessoa { get; set; }


Eu também não consigo compreender muito bem o motivo de se criar uma herança e depois usá-la como composição na mesma entidade.  Por que é necessário manter a propriedade acima? Isso é alguma convenção do Entity?

Veja esse links, talvez possa te ajudar:

medium.com/@fulviocanducci/entity-framework-heran%C3%A7a-73d4223ab776

www.dotnettricks.com/learn/entityframework/understanding-inheritance-in-entity-framework

www.entityframeworktutorial.net/code-first/inheritance-strategy-in-code-first.aspx




_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem quando o corpo está em movimento?



#477269 - 20/10/2017 01:03:09

MRSILVA
MARINGA
Cadast. em:Julho/2015


Muito obrigado Jaba pela orientação .

Meu modelo estava errado agora estou conseguindo inserir registro sem criar mais um em branco.

Meu modelo ficou da seguinte forma:

  [Table("Pessoa")]
   public class Pessoa : EntityBase
    {
      
        public Pessoa()
        {

            //this.enderecos = new HashSet<Endereco>();
            //this.fornecedores = new HashSet<Fornecedor>();
          

        }

        [DisplayName(displayName: "nome")]
        [DataObjectField(primaryKey: false, isIdentity: false, isNullable: true)]
        [StringLength(maximumLength: 80)]
        public string nome { get; set; }

        [DisplayName(displayName: "NomeFantasia")]
        [DataObjectField(primaryKey: false, isIdentity: false, isNullable: true)]
        [StringLength(maximumLength: 80)]
        public string nomeFantasia { get; set; }
        

        [DisplayName(displayName: "Tipo")]
        [DataObjectField(primaryKey: false, isIdentity: false, isNullable: false)]
        public int tipoPessoa { get; set; }

[Table("Fornecedor")]
    public class Fornecedor : EntityBase
    {

        public Fornecedor()
        {

            // this.pessoa = new Pessoa();
        }


        [Browsable(false)]
        [DataObjectField(false, true, false)]

        
        [Index(IsUnique = true)]
        public int PessoaId { get; set; }
        public virtual Pessoa pessoa { get; set; }

        [DisplayName(displayName: "CNPJ/CPF")]
        [DataObjectField(primaryKey: false, isIdentity: false, isNullable: true)]
        [StringLength(maximumLength: 14)]
        public string inscricaoFed { get; set; }

        [DisplayName(displayName: "Inscricão estadual")]
        [DataObjectField(primaryKey: false, isIdentity: false, isNullable: true)]
        [StringLength(maximumLength: 14)]
        public string inscricaoEst { get; set; }


Quanto:
Citação:
Mas você está declarando ele como uma chave estrangeira na classe "Fornecedor", pode ser que esteja dando conflito aí.  Retire isso e trabalhe com a chave primária da classe base EntityBase.  

Citação:  

Como classe fornecedor estava herdando a classe Pessoa e classe pessoa está herdando a classe entityBase o Entity Framework criava a minha chave primaria para classe fornecedor, por isso que pareceu estranho, ou seja minha classe fornecedor tinha chave primaria e a chave estrangeira, bom não sei sé isso mesmo que você questionou.




#477270 - 20/10/2017 02:53:00

JABA
CABO FRIO
Cadast. em:Agosto/2005


Última edição em 20/10/2017 02:55:51 por JABA

Citação:
Como classe fornecedor estava herdando a classe Pessoa e classe pessoa está herdando a classe entityBase o Entity Framework criava a minha chave primaria para classe fornecedor, por isso que pareceu estranho, ou seja minha classe fornecedor tinha chave primaria e a chave estrangeira, bom não sei sé isso mesmo que você questionou.


Sim, foi exatamente isso. Você estava colocando a mesma propriedade como chave primária e estrangeira, ocasionando um conflito. Você já experimentou retirar essa propriedade "PessoaId" da classe Fornecedor, deixando só a que está na classe base EntityBase? Se não funcionar, coloque-o na classe Pessoa. Desta forma, você não precisará ficar colocando um identificador nas classes filhas toda vez que quiser criar uma nova. Se funcionar com uma dessas maneiras, retire também a propriedade "pessoa" da classe Fornecedor e faça o teste.


_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem quando o corpo está em movimento?



#477271 - 20/10/2017 08:18:22

MRSILVA
MARINGA
Cadast. em:Julho/2015


Jaba.

Não fiz o teste ainda, mais se tirar a "PessoaId" da classe Fornecedor como que o Entity vai saber que a classe fornecedor está relacionando com a classe Pessoa através da chave primaria (Id) da classe Pessoa? Acredito que se tirar  "PessoaId" a tabela fornecedor não terá mais relacionamento, ou seja, preciso que cada registro da tabela fornecedor tenha um registro pai na da tabela Pessoa.

Assim puder vou fazer os testes que sugeriu.

obrigado!



#477280 - 20/10/2017 15:17:29

JABA
CABO FRIO
Cadast. em:Agosto/2005


Citação:
Não fiz o teste ainda, mais se tirar a "PessoaId" da classe Fornecedor como que o Entity vai saber que a classe fornecedor está relacionando com a classe Pessoa através da chave primaria (Id) da classe Pessoa? Acredito que se tirar  "PessoaId" a tabela fornecedor não terá mais relacionamento, ou seja, preciso que cada registro da tabela fornecedor tenha um registro pai na da tabela Pessoa.


www.dotnettricks.com/learn/entityframework/understanding-inheritance-in-entity-framework

O último exemplo do link acima é o mesmo caso do seu e mostra que não é necessário fazer isso.

_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem quando o corpo está em movimento?



#477281 - 20/10/2017 16:14:46

MRSILVA
MARINGA
Cadast. em:Julho/2015


Jabá.
Agora entendi, você tem razão, dessa forma  vou ter um atributo a menos para preencher na minha classe fornecedor já que a ID das classes vinculadas serão as mesmas.

Muito obrigado!!!




 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por MRSILVA em 20/10/2017 16:15:08