Table Relationship - EF

4

Good afternoon!

I have the tables "Order of Service" and "Attachment". In my "Service Order" table, I want to be able to attach the scanned service order and be able to attach photos of the equipment.

Order of service

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

        OrdemEscaneada = new Anexo();
        FotosDoEquipamento = new List<Anexo>();
    }


    [Key]
    public int Id { get; set; }

    public int? OrdemEscaneada_Id { get; set; }

    [Display(Name="Ordem de Serviço")]
    [ForeignKey("OrdemEscaneada_Id")]
    public virtual Anexo OrdemEscaneada { get; set; }
    public virtual List<Anexo> FotosDoEquipamento { get; set; }
...

Now the Attachment

public class Anexo
{

    [Key]
    public int Id { get; set; }

    [StringLength(80)]
    public string Nome { get; set; }

    public Byte[] Arquivo { get; set; }

}

I can add and remove the scanned order without problems. I know it would be better to put the relationship in the "Attachment" table, but I can not do it in a good way. I've tried the following:

 public int? FotosDoEquipamento_Id { get; set; }

    [ForeignKey("FotosDoEquipamento_Id")]
    public virtual OrdemDeServico FotosDoEquipamento { get; set; }

The point is that I do not know how to add the photos. I did not want to create another table just for this, and this one already has what I need.

The design of the table created by the system:

    
asked by anonymous 31.07.2015 / 20:27

1 answer

2

Your code is pretty much out of the box, which means that the Entity Framework may not work correctly.

I'll start with the OrdemDeServico entity:

[Table("OrdemDeServico")]
public class OrdemDeServico
{
    public OrdemDeServico() // Este construtor não precisa.
    {
        // Estas inicializações não precisam.
        // O Entity Framework inicializa elas para você.
        OrdemEscaneada = new Anexo();
        FotosDoEquipamento = new List<Anexo>();
    }

    [Key]
    public int Id { get; set; }
    // Esta chave estrangeira está fora do padrão. 
    // O correto é OrdemEscaneadaId.
    public int? OrdemEscaneada_Id { get; set; }

    [Display(Name="Ordem de Serviço")]
    [ForeignKey("OrdemEscaneada_Id")] // Isto aqui não é necessário.
    public virtual Anexo OrdemEscaneada { get; set; }
    // List implementa ICollection. A recomendação é usar
    // a interface, até para que você tenha mais opções na 
    // hora de iterar os objetos.
    public virtual List<Anexo> FotosDoEquipamento { get; set; }
...

It is not incorrect, but needs improvement.

I can not say the same with Anexo . You have defined relationships incorrectly. If Anexo can belong to a work order, but at the same time may contain another service order (because it is a scanned order), the relationship becomes a paradox. By the Entity Framework convention, if OrdemDeServico contains a "Scanned Order", then "Scanned Order" does not have to reference OrdemeServico , but "Scanned Order" remains a Anexo , which forces the table to have a key .

This is not simple to solve and asks for a mixed approach. First, modify Anexo to always belong to OrdemDeServico :

public class Anexo
{
    [Key]
    public int Id { get; set; }
    public int OrdemServicoId { get; set; }

    [StringLength(80)]
    public string Nome { get; set; }

    public Byte[] Arquivo { get; set; }

    public virtual OrdemDeServico OrdemDeServico { get; set; }
}

Second, leave OrdemDeServico in the default:

[Table("OrdemDeServico")]
public class OrdemDeServico
{
    [Key]
    public int Id { get; set; }   
    public int? OrdemEscaneadaId { get; set; }

    [Display(Name="Ordem de Serviço")]
    public virtual Anexo OrdemEscaneada { get; set; }
    public virtual ICollection<Anexo> FotosDoEquipamento { get; set; }
...

In your context class, define the following method using the Fluent API :

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<OrdemDeServico>().HasRequired(x => x.OrdemEscaneada)
        .WithMany()
        .HasForeignKey(x => x.OrdemEscaneadaId)
        .WillCascadeOnDelete(false);

    modelBuilder.Entity<Anexo>()
        .HasRequired(x => x.OrdemDeServico)
        .WithMany(x => x.FotosDoEquipamento)
        .HasForeignKey(x => x.OrdemDeServicoId);

    ...
}
    
01.08.2015 / 22:37