Codefirst Entity Framework database, 1-0.. 1, 1-N

Asked

Viewed 71 times

2

I have 3 tables and need to relate them via code (Code First) inserir a descrição da imagem aqui

I would like to know how to do this. I already have the following table codes:

Tbhistoricoanalogic

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.ComponentModel.DataAnnotations.Schema;

[Table("HistoricoAnalogico")]
public class HistoricoAnalogico {

    public HistoricoAnalogico(){

    }

    /// <summary>
    /// Data e hora do valor
    /// </summary>
    public DateTime DataHora{
        get;
        set;
    }

    /// <summary>
    /// Valor da Digital
    /// </summary>
    public float Valor{
        get;
        set;
    }

}//end HistoricoAnalogico

Tbtendenciaanalogico

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Autonav.ComunicacaoBanco.Autonav.Entidades
{
    [Table("TendenciaAnalogico")]
    public class TendenciaAnalogico : Base
    {
        [Required]
        public long TempoDeVidaEmDias
        {
            get;
            set;
        }

        [Required]
        public int TempoDeColeta
        {
            get;
            set;
        }

        public int tagId { get; set; }
    }
}

Tbtaganalogic

///////////////////////////////////////////////////////////
//  TagAnalogico.cs
//  Implementation of the Class TagAnalogico
//  Generated by Enterprise Architect
//  Created on:      02-set-2016 16:17:48
//  Original author: Silvano
///////////////////////////////////////////////////////////

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.ComponentModel.DataAnnotations.Schema;

/// <summary>
/// Classe responsável por gerar e mapear as entidades da tabela de tag Analogico
/// no banco de dados.
/// </summary>
/// 
[Table("TagAnalogico")]
public class TagAnalogico : Tag {

    //public Tendencia Tendencia;
    //public AlarmeAnalogico alarmeAnalogico;
    //public Dispositivo dispositivo;
    //public Tag tag;

    /// <summary>
    /// Indica qual e o valor maximo que a tag pode variar.
    /// </summary>
    public int BandaMorta{
        get;
        set;
    }

    /// <summary>
    /// Forma que o valor da tag vai ser exibido na tela
    /// </summary>
    public string FormatoExibicao{
        get;
        set;
    }

    /// <summary>
    /// Maior valor que a tag pode receber. Utilizado para mostrar um alerta ou
    /// mensagem
    /// </summary>
    public String MaiorValor{
        get;
        set;
    }

    /// <summary>
    /// Menor valor que a tag pode receber. Utilizado para mostrar um alerta ou
    /// mensagem
    /// </summary>
    public String MenorValor{
        get;
        set;
    }

    /// <summary>
    /// Unidade de engenharia
    /// </summary>
    public string UnidadeDeEngenharia{
        get;
        set;
    }

}//end TagAnalogico
  • From what I understand, Tendencia has N HistoricoAnalogico and each TagAnalogico may have 0 or 1 Tendencia. That’s right?

  • Tendencia may have none or many Historicoanalogico, each Taganalogico may have 1 tendency.

  • Yes, but which record comes first? TagAnalogico or Tendencia?

  • Taganalogic....

1 answer

4


Let’s start with TagAnalogico:

[Table("TagAnalogico")]
public class TagAnalogico : Tag 
{
    // Você precisa identificar ou aqui ou na classe ancestral a chave.
    [Key]
    public int TagAnalogicoId { get; set; }

    //public Tendencia Tendencia;
    //public AlarmeAnalogico alarmeAnalogico;
    //public Dispositivo dispositivo;
    //public Tag tag;

    /// <summary>
    /// Indica qual e o valor maximo que a tag pode variar.
    /// </summary>
    public int BandaMorta { get; set; }

    /// <summary>
    /// Forma que o valor da tag vai ser exibido na tela
    /// </summary>
    public string FormatoExibicao { get; set; }

    /// <summary>
    /// Maior valor que a tag pode receber. Utilizado para mostrar um alerta ou
    /// mensagem
    /// </summary>
    public String MaiorValor { get; set; }

    /// <summary>
    /// Menor valor que a tag pode receber. Utilizado para mostrar um alerta ou
    /// mensagem
    /// </summary>
    public String MenorValor { get; set; }

    /// <summary>
    /// Unidade de engenharia
    /// </summary>
    public string UnidadeDeEngenharia { get; set; }

    // Aqui são declaradas as propriedades de navegação.
    // É por elas que o Entity Framework é capaz de deduzir as relações entre Models.
    // Elas PRECISAM ser `virtual`, ou o Entity Framework não irá entender a anotação. 
    public virtual TendenciaAnalogico TendenciaAnalogico { get; set; }

}//end TagAnalogico

Like Tendencia is 0.. 1 with TagAnalogico, it must have, by definition, the same key of TagAnalogico. That is, the primary key of Tendencia is also foreign key to TagAnalogico:

[Table("TendenciaAnalogico")]
public class TendenciaAnalogico : Base
{
    // Veja que aqui anoto que a chave é primária e estrangeira ao mesmo tempo.
    // Veja mais abaixo que "TagAnalogico" é uma propriedade virtual, 
    // indicando ao Entity Framework a relação 1-0..1. 
    [Key, ForeignKey("TagAnalogico")]
    public int TendenciaAnalogicoId { get; set; }

    // Procure colocar todas as chaves, primárias ou estrangeiras, no começo da declaração da classe.
    public int tagId { get; set; }

    [Required]
    public long TempoDeVidaEmDias { get; set; }

    [Required]
    public int TempoDeColeta { get; set; }

    // Aqui a propriedade de navegação que associa TagAnalogico com Tendencia.
    public virtual TagAnalogico TagAnalogico { get; set; }
    // Aqui a propriedade que relaciona 1 Tendencia com N HistoricoAnalogico
    public virtual ICollection<HistoricoAnalogico> Historicos { get; set; }
}

Note that setting 1 to N is done by annotating public virtual ICollection<> in Tendencia. Likewise, we need to put the inverse relation in HistoricoAnalogico through two elements:

  1. The foreign key field;
  2. The navigation property of the related entity.

That is to say:

[Table("HistoricoAnalogico")]
public class HistoricoAnalogico 
{
    [Key]
    public int HistoricoAnalogicoId { get; set; }
    // 1. O campo da chave estrangeira;
    public int TendenciaId { get; set; }

    // Não precisa isto
    //public HistoricoAnalogico(){

    // }

    /// <summary>
    /// Data e hora do valor
    /// </summary>
    public DateTime DataHora { get; set; }

    /// <summary>
    /// Valor da Digital
    /// </summary>
    public float Valor { get; set; }

    // 2. A propriedade de navegação da entidade relacionada.
    public virtual TendenciaAnalogico TendenciaAnalogico { get; set; }
}//end HistoricoAnalogico
  • In Taganalogico is like that? public virtual Tendencia Tendencia or missed the get; set; ?

  • My own mistake. Sorry. I’ve already edited.

  • ta me returning the error at the time I will do Migrations: Unable to determine the main end of an Association between the types 'Taganalogico' and 'Autonav.ComunicacaoBanco.Autonav.Entidades.Tendenciaanalogico'. The main end of this Association must be explicitly configured using either the Relationship Fluent API or data Annotations.

  • Ah, yes. You must have Tendencia and TendenciaAnalogico in the same project. I will edit again to be clearer.

  • @Jeffersonsouza See the modification I made in TagAnalogico.

Browser other questions tagged

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