none
Primo passo nella realizzazione di un DB RRS feed

  • Domanda

  • Ho realizzato una semplice tabella chiamata COMUNI che, come si evince facilmente dal nome, conterrà l'elenco dei Comuni d'Italia.

    CREATE TABLE dbo.Comuni(
    ComuneID int NOT NULL PRIMARY KEY,
    Comune varchar(10) NOT NULL
    );

    Partendo da questa, ho creato una seconda tabella chiamata CUSTOMER con l'idea di memorizzare un elenco di persone ovvero Nome, Cognome e luogo di Nascita. Dove per luogo di nascita intendo un riferimento alla precedente tabella Comuni.

    CREATE TABLE dbo.Customers(
    CustomerID int NOT NULL PRIMARY KEY,
    Cognome varchar(10) NOT NULL,
    Nome varchar(10) NOT NULL,
    ComuneNascitaID int NOT NULL,
    CONSTRAINT FK_Customer_Nascita FOREIGN KEY(ComuneNascitaID)
    REFERENCES dbo.Comuni(ComuneID)
    );

    Se questo script è corretto, passo al punto successivo: ho la necessità di inserire un ulteriore colonna nella tabella Customer che dovrà contenere anche il Comune di Residenza, oltre a quello di Nascita. Quindi, immagino che dovrò creare un ComuneResidenzaID che faccia riferimento a ComuneID della tabella Comuni. In pratica un doppio riferimento alla tabella Comuni.

    Se questo è corretto, come modifico lo script per la tabella Customer?

    mercoledì 4 settembre 2013 09:17

Risposte

  • Semplicemente aggiungendo l'ulteriore campo per la Residenza e creando la relativa constraint.

    CREATE TABLE dbo.Comuni(
    ComuneID int NOT NULL PRIMARY KEY,
    Comune varchar(10) NOT NULL
    );
    
    CREATE TABLE dbo.Customers(
    CustomerID int NOT NULL PRIMARY KEY,
    Cognome varchar(10) NOT NULL,
    Nome varchar(10) NOT NULL,
    ComuneNascitaID int NOT NULL,
    ComuneResidenzaID int NOT NULL,
    CONSTRAINT FK_Customer_Nascita FOREIGN KEY(ComuneNascitaID) REFERENCES dbo.Comuni(ComuneID),
    CONSTRAINT FK_Customer_Residenza FOREIGN KEY(ComuneResidenzaID) REFERENCES dbo.Comuni(ComuneID)
    );

    • Proposto come risposta Daniele Cazzaro mercoledì 4 settembre 2013 09:46
    • Contrassegnato come risposta Irina Turcu mercoledì 25 settembre 2013 12:04
    mercoledì 4 settembre 2013 09:29

Tutte le risposte

  • Semplicemente aggiungendo l'ulteriore campo per la Residenza e creando la relativa constraint.

    CREATE TABLE dbo.Comuni(
    ComuneID int NOT NULL PRIMARY KEY,
    Comune varchar(10) NOT NULL
    );
    
    CREATE TABLE dbo.Customers(
    CustomerID int NOT NULL PRIMARY KEY,
    Cognome varchar(10) NOT NULL,
    Nome varchar(10) NOT NULL,
    ComuneNascitaID int NOT NULL,
    ComuneResidenzaID int NOT NULL,
    CONSTRAINT FK_Customer_Nascita FOREIGN KEY(ComuneNascitaID) REFERENCES dbo.Comuni(ComuneID),
    CONSTRAINT FK_Customer_Residenza FOREIGN KEY(ComuneResidenzaID) REFERENCES dbo.Comuni(ComuneID)
    );

    • Proposto come risposta Daniele Cazzaro mercoledì 4 settembre 2013 09:46
    • Contrassegnato come risposta Irina Turcu mercoledì 25 settembre 2013 12:04
    mercoledì 4 settembre 2013 09:29
  • Benissimo è proprio quello che pensavo.

    Ma da un punto di vista teorico che tipo di relazione è questa? Continua ad essere una relazione "Uno a molti", sebbene adesso sono due i riferimenti alla tabella Comuni?

    mercoledì 4 settembre 2013 10:53
  • Ciao

    Non è UNA relazione, sono due relazioni distinte realizzate sulla stessa coppia di tabelle. Entrambe uno a molti.

    Di fatto stai associando le tabelle tramite un vincolo concettuale che nei due casi è diverso. 

    Se ti può essere di aiuto visualizza graficamente tramite un diagramma SQL le due tabelle e vedrai che i collegamenti sono due non uno. Ognuno di questi rappresenta una relazione.



    mercoledì 4 settembre 2013 12:32
  • Ok! E' proprio quello che mi interessava. Adesso sto provando a trasformare il tutto in Code First per poter utilizzare al meglio Entity Framework 5.0 Questo è parte del codice:

    public class Comuni
        {
            public int ComuneId { get; set; }
            public string Comune { get; set; }
        }
    
    public class Customers
        {
            public int CustomerId { get; set; }
            public string Cognome { get; set; }
            public string Nome { get; set; }
        }
    Tuttavia ho difficoltà a gestire la doppia relazione. Ho letto in altri posti che dovrei utilizzare la "InverseProprety", ma non riesco a capire come fare.
    venerdì 6 settembre 2013 08:02
  • Non sono un gran conoscitore di Entity Framework quindi potrei dire qualche stupidaggine, ma credo che ti basti definire nella classe Customer le due proprietà specificando la corretta ForeignKey in questo modo.


    public class Comuni { public int ComuneId { get; set; } public string Comune { get; set; } } public class Customers { public int CustomerId { get; set; } public string Cognome { get; set; } public string Nome { get; set; }

    [ForeignKey("ComuneNascitaID")] public Comuni ComuneNascita { get; set; }

    [ForeignKey("ComuneResidenzaID")]
    public Comuni ComuneResidenza { get; set; } }



    venerdì 6 settembre 2013 09:16