CodeFirst Entity Framework database, 1-0..1.1-N
I have 3 tables and need to relate them via code (Code First)
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
2
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:
- the foreign key field;
- 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