none
Relacionamento no EF 6 (Code First) RRS feed

  • Pergunta

  • Bom dia, estou com o seguinte problema.

    Estou usando EF 6 com Code First e tenho duas classes: Cliente e Versao.

    Cada cliente está relacionado a uma versão (logo cada versão pode estar relacionada a nenhum cliente ou a vários).

    Eu preciso saber como eu faço essa relação.

    Tentei fazer da forma abaixo:

    [Table("CLIENTES")]
        public class Cliente
        {
            public Cliente()
            {
    
            }
    
            [Key]
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
            public int Id { get; set; }
            public TipoPessoa TipoPessoa { get; set; }
            public string NomeRazao { get; set; }
            public string NomeFantasia { get; set; }
            public long CpfCnpj { get; set; }
            public string RG_InscEstadual { get; set; }
            public string InscMunicipal { get; set; }
            public DateTime? DataNascimento_Fundacao { get; set; }
            public bool Ativo { get; set; }
    
            public int Fone1 { get; set; }
            public int Fone2 { get; set; }
            public int Fone3 { get; set; }
            public int Email1 { get; set; }
            public int Email2 { get; set; }
            public int Email3 { get; set; }
            public string Site { get; set; }
    
            public DateTime? DataCadastro { get; set; }
            public string UsuarioCadastro { get; set; }
    
            public DateTime? ClienteDesde { get; set; }
            public DateTime? DTHR_UltimaAtualizacao { get; set; }
    
            [InverseProperty("Id")]
            public virtual Versao VersaoAtual { get; set; }
    
    }
    
    [Table("VERSOES")]
        public class Versao
        {
            public Versao()
            {
                ClientesComEssaVersao = new List<Cliente>();
            }
    
            [Key]
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
            public int Id { get; set; }
            public string NumVersao { get; set; }
            public DateTime? DataLancamento { get; set; }
            public DateTime? DataLiberacao { get; set; }
            public string Observacao { get; set; }
    
            public DateTime? DataCadastro { get; set; }
            public string UsuarioCadastro { get; set; }
    
            public ICollection<Cliente> ClientesComEssaVersao { get; set; }
    }

    Dessa forma o banco de dados é criado corretamente (pelo menos no meu ponto de vista), mas eu não consigo salvar as relações. Além disso eu tentei inserir manualmente na coluna VersaoAtual_Id (da tabela cliente) um valor existente na tabela VERSOES e quando eu instanciei o meu cliente ele não trouxe a instância da classe Versao.

    Alguém sabe como me ajudar?


    Jéferson Tavares

    quarta-feira, 14 de maio de 2014 14:30

Respostas

Todas as Respostas

  • Na classe cliente remova [InverseProperty("Id")] e coloque [System.ComponentModel.DataAnnotations.Schema.ForeignKey("IdVersao")]

    Na classe crie uma propriedade "public int IdVersao{get;set;}" se for obrigatório cada cliente ter uma versão, caso não,  "public int? IdVersao{get;set;}"

    quarta-feira, 14 de maio de 2014 19:38
  • Fiz isso:

    public int? VersaoAtualId { get; set; }
            [ForeignKey("VersaoAtualId")]
            public virtual Versao VersaoAtual { get; set; }

    Assim eu consigo salvar o Id da versão no cliente usando a propriedade VersaoAtualId. Mas na hora que eu dou um Context.Clientes.Find() ele não deveria trazer a propriedade VersaoAtual instanciada?


    Jéferson Tavares

    quarta-feira, 14 de maio de 2014 19:49
  • Não!

    using System.Data.Entit;

    Context.Clientes.Include(c=>c.VersaoAtual).Find() 

    http://msdn.microsoft.com/en-us/library/bb738708.aspx

    quarta-feira, 14 de maio de 2014 19:59
  • Não!

    using System.Data.Entit;

    Context.Clientes.Include(c=>c.VersaoAtual).Find() 

    Cara, esse .Find não é reconhecido. 

    Jéferson Tavares

    quarta-feira, 14 de maio de 2014 20:09
  • Context.Clientes.Include(c.VersaoAtual).FirstOrDefault(c=> c.Id == 1)
    quarta-feira, 14 de maio de 2014 20:24