none
EntityFramework 5 - code first e relazione uno a molti RRS feed

  • Domanda

  • Ciao a tutti,

    Ho la seguente classe:

      public class Commissione
        {
            public Commissione()
            {
                    
            }
    
            [Key]
            public int Id { get; set; }
    
            
            public virtual Citta CittaPartenza { get; set; }
    
            public virtual Citta CittaDestinazione { get; set; }
    
            public decimal Compenso { get; set; }
            
    
        }
    

    e quindi :

     public class Citta
        {
            public Citta()
            {
                this.ListaCommissioniPartenza = new List<Commissione>();
                this.ListaCommissioniArrivo = new List<Commissione>();   
            }
    
            [Key]
            public int ID { get; set; }
    
            public string NomeCitta { get; set; }
    
            public virtual Nazione Link_Nazione { get; set; }
            
            
            public virtual ICollection<Commissione> ListaCommissioniPartenza { get; set; }
    
    
            public virtual ICollection<Commissione> ListaCommissioniArrivo { get; set; }
        }

    Andando a generare lo scaffolding con packet manager mi genera questo :

    public override void Up()
            {
                CreateTable(
                    "dbo.Commissiones",
                    c => new
                        {
                            Id = c.Int(nullable: false, identity: true),
                            
                            Compenso = c.Decimal(nullable: false, precision: 18, scale: 2),
                            CittaPartenza_ID = c.Int(),
                            CittaDestinazione_ID = c.Int(),
                            Citta_ID = c.Int(),
                            Citta_ID1 = c.Int(),
                        })
                    .PrimaryKey(t => t.Id)
                    .ForeignKey("dbo.Cittas", t => t.CittaPartenza_ID)
                    .ForeignKey("dbo.Cittas", t => t.CittaDestinazione_ID)
                    .ForeignKey("dbo.Cittas", t => t.Citta_ID)
                    .ForeignKey("dbo.Cittas", t => t.Citta_ID1)
                    .Index(t => t.CittaPartenza_ID)
                    .Index(t => t.CittaDestinazione_ID)
                    .Index(t => t.Citta_ID)
                    .Index(t => t.Citta_ID1);
                
             
            }

    Cosa sbaglio? E' giusto come ho fatto?



    Se questo post risponde alla tua domanda ricorda di contrassegnarlo come risposta. In questo modo aiuterai altri utenti che hanno lo stesso problema a trovare la risposta più velocemente. Grazie.

    martedì 9 ottobre 2012 07:54

Risposte

  • Ok, trovata la soluzione come descritto qui: http://domusdotnet.org/articoli/primi-passi-con-ef-code-first-%28-parte-2%29.aspx

    Si deve usare InverseProperty:

    public class Citta
        {
            public Citta()
            {
                this.ListaCommissioniPartenza = new List<Commissione>();
                this.ListaCommissioniArrivo = new List<Commissione>();   
            }
    
            [Key]
            public int ID { get; set; }
    
            public string NomeCitta { get; set; }
    
            
            [InverseProperty("CittaPartenza")]
            public virtual ICollection<Commissione> ListaCommissioniPartenza { get; set; }
    
    
            [InverseProperty("CittaDestinazione")]
            public virtual ICollection<Commissione> ListaCommissioniArrivo { get; set; }
        }

    e

     public class Commissione
        {
            public Commissione()
            {
                    
            }
    
            [Key]
            public int Id { get; set; }
    
           
            public virtual Citta CittaPartenza { get; set; }
    
            public virtual Citta CittaDestinazione { get; set; }
    
            public decimal Compenso { get; set; }
    
        }

    In questo modo lo scaffolding diventa:

     public override void Up()
            {
                CreateTable(
                    "dbo.Commissiones",
                    c => new
                        {
                            Id = c.Int(nullable: false, identity: true),
                            Compenso = c.Decimal(nullable: false, precision: 18, scale: 2),
                            CittaPartenza_ID = c.Int(),
                            CittaDestinazione_ID = c.Int(),
                        })
                    .PrimaryKey(t => t.Id)
                    .ForeignKey("dbo.Cittas", t => t.CittaPartenza_ID)
                    .ForeignKey("dbo.Cittas", t => t.CittaDestinazione_ID)
                    .Index(t => t.CittaPartenza_ID)
                    .Index(t => t.CittaDestinazione_ID);
                
    
            }


    Se questo post risponde alla tua domanda ricorda di contrassegnarlo come risposta. In questo modo aiuterai altri utenti che hanno lo stesso problema a trovare la risposta più velocemente. Grazie.

    • Contrassegnato come risposta bab76 martedì 9 ottobre 2012 09:05
    martedì 9 ottobre 2012 09:05

Tutte le risposte

  • Ciao bab76,

    le classi mi sembrano corrette, non è che è lo scaffolding che sbaglia?

    se cancelli le 2 righe di FK su Citta_ID e Citta_ID1 e le equivalenti per la crezione dell'index e mandi in esecuzione ti da qualche errore?

    Ciao M.

    martedì 9 ottobre 2012 08:49
  • Ok, trovata la soluzione come descritto qui: http://domusdotnet.org/articoli/primi-passi-con-ef-code-first-%28-parte-2%29.aspx

    Si deve usare InverseProperty:

    public class Citta
        {
            public Citta()
            {
                this.ListaCommissioniPartenza = new List<Commissione>();
                this.ListaCommissioniArrivo = new List<Commissione>();   
            }
    
            [Key]
            public int ID { get; set; }
    
            public string NomeCitta { get; set; }
    
            
            [InverseProperty("CittaPartenza")]
            public virtual ICollection<Commissione> ListaCommissioniPartenza { get; set; }
    
    
            [InverseProperty("CittaDestinazione")]
            public virtual ICollection<Commissione> ListaCommissioniArrivo { get; set; }
        }

    e

     public class Commissione
        {
            public Commissione()
            {
                    
            }
    
            [Key]
            public int Id { get; set; }
    
           
            public virtual Citta CittaPartenza { get; set; }
    
            public virtual Citta CittaDestinazione { get; set; }
    
            public decimal Compenso { get; set; }
    
        }

    In questo modo lo scaffolding diventa:

     public override void Up()
            {
                CreateTable(
                    "dbo.Commissiones",
                    c => new
                        {
                            Id = c.Int(nullable: false, identity: true),
                            Compenso = c.Decimal(nullable: false, precision: 18, scale: 2),
                            CittaPartenza_ID = c.Int(),
                            CittaDestinazione_ID = c.Int(),
                        })
                    .PrimaryKey(t => t.Id)
                    .ForeignKey("dbo.Cittas", t => t.CittaPartenza_ID)
                    .ForeignKey("dbo.Cittas", t => t.CittaDestinazione_ID)
                    .Index(t => t.CittaPartenza_ID)
                    .Index(t => t.CittaDestinazione_ID);
                
    
            }


    Se questo post risponde alla tua domanda ricorda di contrassegnarlo come risposta. In questo modo aiuterai altri utenti che hanno lo stesso problema a trovare la risposta più velocemente. Grazie.

    • Contrassegnato come risposta bab76 martedì 9 ottobre 2012 09:05
    martedì 9 ottobre 2012 09:05
  • Ciao.

    Sembra che lo scaffolding non ti riconosca le corrisponenze tra entità e ti aggiunga 2 colonne di troppo (citta_ID e citta_ID1)

    Prova a fare l'override di DbContext.OnModelCreating(modelBuilder) e scrivere:

    builder.Entity<Città>().HasMany(c=>c.ListaCommissioniPartenza).WithRequired(c=>c.cittàPartenza);
    

    (stessa cosa con ListaCommissioniArrivo). Dovrebbe sistemare il problema.

    martedì 9 ottobre 2012 09:06