CodeFirst Entity Framework database, 1-0..1.1-N

I have 3 tables and need to relate them via code (Code First) insert the description of the image here

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

Tbhistoricanalogic

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

Tbtendencyanalogic

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
Author: Leonel Sanches da Silva, 2017-03-27

1 answers

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

As Tendencia is 0..1 with TagAnalogico, it needs to have, by definition, the same key as TagAnalogico. That is, the primary key of Tendencia is also foreign key for 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; }
}

Notice that the configuration from 1 to N is done through an annotation public virtual ICollection<> in Tendencia. Similarly, 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.

I.e.:

[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
 4
Author: Leonel Sanches da Silva, 2017-03-27 19:26:34