80 messaggi dal 17 maggio 2011
Ciao a tutti,

Ho un comportamento che non comprendo, pratica io ho creato i seguenti model :
    public class Measure
    {
        public int Id { get; set; }

        [Required(ErrorMessageResourceType = typeof(Resources.Global), ErrorMessageResourceName = "Required")]
        public int Plant_Id { get; set; }
        [ForeignKey("Plant_Id")]
        public virtual Plant Plant { get; set; }
        .......
    }

    [Table("Digitals")]
    public class Digital : Measure
    {
     .........
    }

    [Table("Analogs")]
    public class Analog : Measure
    {
       ............
    }



Quando genero la migration e creo il database sia la tabella Measure che le tabelle analogs e digital hanno il campo Plant_Id
Inoltre se io creo una analogs :
db.Analogs.Add(new Analog { Id = 1, MeasureType_Id = 1, Plant_Id = 1, ....... });


Il campo Plant_Id viene valorizzato nella tabella Measure e nella tabella analogs e digital è a NULL.
Questo mi destabilizza parecchio perchè io non posso fare un where condition su analog e digital con .where(f=>f.Plant_Id == 1).

Riuscireste ad aiutarmi a capire il perchè?

Ciao
Paolo
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Paolo,


Il campo Plant_Id viene valorizzato nella tabella Measure e nella tabella analogs e digital è a NULL.

Sei sicuro che sia stata la migration a generarti il campo Plant_Id anche nelle tebelle Analogs e Digitals?
Sembra un rimasuglio di una precedente migration, quando non avevi ancora fatto l'ereditarietà, oppure di una modifica fatta a mano. Il fatto che restino a NULL è appunto un indizio del fatto che siano caduti in disuso.

Vai a vedere i file di codice delle precedenti migration per capire quando erano stati generati.


Questo mi destabilizza parecchio perchè io non posso fare un where condition su analog e digital con .where(f=>f.Plant_Id == 1).

Beh, penso che quel Plant_Id ora venga cercato nella tabella Measures, no? Lo puoi verificare loggando le query inviate da Entity Framework. Quella Where non ti restituisce alcun risultato? (Ammesso che nella tabella Measures esista almeno un record con Plant_Id=1).

ciao,
Moreno

Enjoy learning and just keep making
80 messaggi dal 17 maggio 2011
Ho scoperto l'arcano.
nel model Plant ho queste due collection
        public virtual ICollection<Digital> Digitals { get; set; }
        public virtual ICollection<Analog> Analogs { get; set; }


Mai e poi mai avrei pensato che fosse dovuto a questo.
Invece queste due collection generavano un Plant_Id, giustamente da una parte perchè altrimenti non avevano riferimenti.
Però pensavo, stupidamente, che in quanto fossero extension di measure, prendessero il Plant_Id da measure.. mi sbagliavo.


Per ora ho deciso di mantenere ridondanza del Plant_Id sia in digital che analogs che measure, mi viene troppo comodo.. non so se sia una decisione sana, ma posso valutarla in seguito.

L'alternativa è rimuovere le due collection e usare solo plant_id nella measure.

Solo che se nel plant metto una collection measure, non ho idea di come andare a filtrare la collezioni per avere tutte le analogs in quanto dynamics.

Grazie mille dei consigli

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.