12 messaggi dal 21 settembre 2014
Buongiorno
Ho un problema banale che pero' non riesco a risolvere in nessun modo, le mie classi sono queste:

 public class LoginUser
    {
        [Key]
        public string NomeUtente { get; set; }

        [Required]
        public string Password { get; set; }

        public int? UtenteId { get; set; }
        public int? TecnicoId { get; set; }
        public virtual Tecnico Tecnico { get; set; }
        public virtual Utente Utente { get; set; }
    }

public class Utente
    {
        [Key]
        public int UtenteId { get; set; }
        
        //Varie Proprieta'

        public virtual LoginUser LoginUser { get; set; }
    }

public class Tecnico
    {
        [Key]
        public int TecnicoId { get; set; }

        //Varie Proprieta'

        public virtual LoginUser LoginUser { get; set; }
    }


Vorrei instaurare una relazione 1 a 0..1 Tra i LoginUser e gli Utenti e un'altra sempre 1 a 0..1 tra LoginUser e i Tecnici, Questo perche' in pratica ad un utente di login posso associare il profilo di un Utente o di un Tecnico a scelta.

Non sono riuscito in nessun modo a far si che le proprieta' TecnicoId e UtenteId dentro a LoginUser siano le relative foreignkey del oggetto collegato e che sul DB nella tabella LoginUser vi siano 2 colonne con questi 2 nomi a fare da foreignkey verso le relative tabelle.

Mi potete dare una dritta su come fare?

Grazie
89 messaggi dal 13 marzo 2010
Potresti postare il codice che usi per mappare le entity?
Ti consiglio poi di dare una lettura a questo articolo:

http://www.codeproject.com/Articles/806344/One-to-zero-one-relation-in-entity-framework-code
12 messaggi dal 21 settembre 2014
Per mappare le entity ho provato così:

            modelBuilder.Entity<Utente>()
                .HasOptional(e => e.LoginUser)
                .WithOptionalPrincipal(e => e.Utente)
                .WillCascadeOnDelete(false);

            modelBuilder.Entity<Tecnico>()
                .HasOptional(e => e.LoginUser)
                .WithOptionalPrincipal(e => e.Tecnico)
                .WillCascadeOnDelete(false);


Il risultato è stato che le proprietà di navigazione tra le entity funzionano ma invece di usarmi le 2 proprietà TecnicoId e UtenteId di LoginUser come ForegnKey mi ha creato sul DB altre 2 colonne chiamata Utente_UtenteId e Tecnico_TecnicoId e usa queste come FK.
89 messaggi dal 13 marzo 2010
Infatti nel codice non stai specificando che la relazione usa una foreign key e quindi EF ne crea una per te.

Ecco quanto riportato su MSDN (http://msdn.microsoft.com/en-us/data/jj591620.aspx):

"...

If the foreign key property on the Course class was called SomeDepartmentID instead of DepartmentID, you would need to do the following to specify that you want SomeDepartmentID to be the foreign key:

modelBuilder.Entity<Course>()
.HasRequired(c => c.Department)
.WithMany(d => d.Courses)
.HasForeignKey(c => c.SomeDepartmentID);

...."

Come vedi in questo caso viene specificato quale FK usare per la relazione. Per maggiori dettagli ti consiglio di dare un'occhiata alla pagina indicata sopra.

Buon lavoro.
Federico
12 messaggi dal 21 settembre 2014
Grazie della risposta, avevo gia' visto questa pagina ma il problema che a me dopo la definizione della relazione il compilatore non mi fa inserire la clausula .HasForeignKey(c => c.xxx), le uniche scelte che ho sono .Map() e .WillCascadeOnDelete().

Potrebbe essere che non sia possibile farlo per una relazione 1 to 0..1?


 
modelBuilder.Entity<LoginUser>()
.HasOptional(e => e.Utente)
.WithOptionalDependent(e => e.LoginUser)

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.