Database CodeFirst Entity Framework, 1-0..1, 1-N

2

I have 3 tables and need to relate them via code (Code First)

Iwouldliketoknowhowtodothis.Ialreadyhavethefollowingcodesfromthetables:

TbHistoricoAnalogico

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.IO;usingSystem.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

TbAnalogicalTrend

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; }
    }
}

TbTagAnalogico

///////////////////////////////////////////////////////////
//  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
    
asked by anonymous 27.03.2017 / 19:04

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
Since Tendencia is 0..1 with TagAnalogico , it must 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; }
}

Note that the setting from 1 to N is done with a public virtual ICollection<> annotation in Tendencia . Similarly, we need to put the inverse relation in HistoricoAnalogico through two elements:

  • The foreign key field;
  • The navigation property of the related entity.
  • That is:

    [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
    
        
    27.03.2017 / 19:38