2013-03-12 9 views
11

Le seguenti sono due tabelle parziali in cui sto tentando di definire una relazione di chiave esterna.Creazione di una relazione di entità con campi rinominati e chiave non primaria nella tabella primaria

public class Form 
{ 
    [Key, Column("FormID")] 
    public System.Guid FormGUID { get; set; } 

    [Column("PatGUID")] 
    public Nullable<System.Guid> PatientGUID { get; set; } 
} 

public class Patient 
{ 
    [Column("PatGUID")] 
    public System.Guid PatientGUID { get; set; } 

    [Key, Column("PatID")] 
    public int PatientID { get; set; } 

}

ho eliminato tutte, ma le pertinenti informazioni, i campi, navigazioni, ecc per questo esempio; speriamo non troppo.

Abbiamo una tabella Form, con un FK di PatGUID in una tabella paziente con campo PatGUID. La tabella Paziente ha un campo KEY int. PatID.

Abbiamo i requisiti per rinominare i nostri campi per i nostri modelli di codice prima entità; i campi rilevanti in questo esempio che devono essere modificati è PatGUID modificato in PatientGUID.

La difficoltà che sto provando è quella di definire questa chiave esterna utilizzando annotazioni o fluente.

Così il risultato finale quello che serve è:

  • Chiave primaria Tabella: Paziente, Campo: PatGUID (rinominato PatientGUID)

  • Esteri Tabella chiave: Modulo, Campo: PatGUID (rinominato PatientGUID)

Questo non sembra dovrebbe rappresentare un grosso problema ma con la combinazione di Patient.PatGUID non essendo la chiave primaria ei campi PatGUID che sono stati rinominati in PatientGUID non hanno abilitato il servizio dati WCF per creare correttamente un riferimento con un riferimento appropriato quindi corretta selezione/join di:

SELECT … FROM [dbo].[Form] AS [Extent1] 
INNER JOIN [dbo].[Patient] AS [Extent2] ON [Extent1].[PatGUID] = [Extent2].[PatGUID] 

risposta

14

EF non supporta ancora rapporti in cui la chiave del principale non è la chiave primaria, ma qualche altra colonna con un vincolo di chiave unica. È on the feature request list ma non implementato né sulla mappa stradale per la prossima versione (EF 6). Se viene implementato del tutto (in EF 7 forse), aspettati di aspettare un anno o più finché non è pronto per la produzione.

Nel vostro particolare modello EF non riconosce alcuna relazione tra Form e Patient a tutti perché Patient.PatientID è contrassegnato come [Key], non Patient.PatientGUID, e tratta i EF Form.PatientGUID come una proprietà scalari normale, non come un FK a Patient.

In teoria si potrebbe simulare Patient.PatientGUID come la proprietà [Key] nel modello sebbene non sia la chiave primaria nel database se non si crea il modello dal database o dal database da un modello code-first, cioè , se si esegue la mappatura tra il modello e il database (esistente) manualmente. Ma non sono sicuro che ciò non causerebbe problemi sottili da nessun'altra parte.

L'alternativa è scrivere le istruzioni del manuale join in LINQ se si desidera recuperare Patients e relativo Forms. È quindi possibile unire due entità utilizzando proprietà arbitrarie, non solo le proprietà chiave.Questo è, a mio parere, l'approccio più pulito e meno "difficile". Tuttavia, lo svantaggio è che non avrai proprietà di navigazione - riferimenti o collezioni - tra Patient e Form e non puoi utilizzare funzionalità come caricamento ansioso (Include), caricamento lento o comoda "sintassi del percorso tratteggiata" (come Form.Patient.SomePatientProperty, ecc. .) nelle query LINQ.

+3

Non esattamente quello che volevo sentire, ma almeno una risposta definitiva sul motivo per cui non sono riuscito a farlo funzionare e sapendo che ho bisogno di trovare soluzioni alternative. – user2144404