2015-07-20 8 views
12

Stiamo imparando Entity Framework 6.1 (da NuGet) mentre ci spostiamo da Linq2Sql. Abbiamo una piccola manciata di tabelle che associano due tabelle separate come mostrato di seguito.Entity Framework 6 - Tabella mancante con solo chiavi primarie che fanno riferimento a tabelle diverse

EF6 Database di prima generazione

DB Schema:

enter image description here

Schema Panoramica:

enter image description here

Quando negli studi visivi, libreria di classi vuoto, facendo un database Prima EF6 File EDMX, il diagramma genera solo TableA e TableC - la TableB fa non essere generato.

enter image description here

visivo Studios Vista:

enter image description here

Si può vedere che solo TableA e TableC vengono creati. Tecnicamente dovrebbe essere stato creato TableB, perché vorresti essere in grado di gestire quei riferimenti.

L'associazione tra A e C mostrato nella figura:

enter image description here

Mi sento come se mi manca un'opzione, o di incomprensione un concetto chiave di Entity Framework. Qualche idea su come avere il TableB mancante generato con il T4? Il file EDMX lo mostra, ma per qualche motivo non viene generato in un file .CS con le due proprietà che indicano la relazione.

Il motivo principale per cui abbiamo bisogno di questo, è stato esteso il modello T6 EF6 per aggiungere alcuni modelli di fabbrica per abbinare i nostri modelli esistenti. Poiché non genera una classe per TableB, non otteniamo il codice generato automaticamente che stiamo cercando.

Pensieri/suggerimenti? Grazie.

+2

forse EF comprende che TableB non ha alcun significato ed è solo per la relazione molti-a-molti? – Disappointed

risposta

5

entità debole o unire le tabelle non verrà generato da EF, è necessario configurare i rapporti manualmente tramite API fluente o utilizzando le annotazioni di dati

Come indicato sul sito Web di Microsoft: sotto convenzione di relazione:

Nota: Se si dispone di più le relazioni tra gli stessi tipi (per esempio, si supponga di definire le classi Person e Book, dove la classe Person contiene il ReviewedBooks e AuthoredBooks navigazione 012 Proprietàe la classe Book contiene le proprietà di spostamento Author e Reviewer ) è necessario configurare manualmente le relazioni utilizzando le Annotazioni dati o l'API fluente. Per ulteriori informazioni su , consultare Annotazioni dati - API Relazioni e fluenti - Relazioni.

riferimento a questo link per maggiori informazioni

AGGIORNAMENTO

Una soluzione funzionerà in caso di EDMX (ma costi di manutenzione) come segue:

  1. Rimuovere l'estero chiavi dalla tabella di join nel database
  2. Aggiornamento di EDMX dal database
  3. ricreare le chiavi esterne della tabella unirsi

questa soluzione funzionerà finché non sarà possibile aggiornare il modello dal database di nuovo.

Soluzione consigliata, tenere tutto come è stato generato da EDMX e saperne di più su come utilizzare il funzionamento CRUD per questo caso utilizzando i seguenti collegamenti che sono stati segnalati "utile" da parte dell'utente '@TravisWhidden'

  1. Insert/Update Many to Many Entity Framework . How do I do it?
  2. https://www.youtube.com/watch?v=uMQwORSTGX4 (video)
+0

Sembra che sarebbe utile se fossi andato con il primo metodo del codice --- ma poiché stiamo facendo "EF Designer dal Database", non posso trovare nel file XML di EDMX dove è possibile impostare le annotazioni fluide dei dati o le annotazioni dei dati. – TravisWhidden

+0

@TravisWhidden puoi creare una soluzione alternativa, rimuovere le chiavi primarie dalla tabella di join e dopo aver generato edmx, reinserirle e se il modello non ha funzionato perché la tabella non ha una chiave primaria, rimuovine una e prova – Monah

+0

La rimozione della chiave primaria non ha aiutato, ma la rimozione dei vincoli di chiave esterna ha fatto. Tuttavia, dopo averli restituiti e visto cosa succede quando si preme "aggiornamento dal database", le associazioni in XML ritornano, e quando si va ad aggiungere un'entità alla tabella, dopo SaveChanges() si genera un'eccezione dovuta all'associato vincolo. Non sarebbe ragionevole aspettarsi che qualsiasi dev del team si ricordi di cancellare manualmente tutte le associazioni con le coppie di tabelle se dovessero mai "aggiornare" il file EDMX. Quindi, anche se una possibile soluzione, continua a resistere per una più manutenibile. – TravisWhidden

2

Come indicato da @Hadi Hassan, EF non “Exposé” o riconoscere tabelle relazionali che sono costituiti esclusivamente da altre entità.

aggirare:
Se è necessario solo per ‘leggere’ i dati

  1. è possibile definire un view nello schema per TableB.
  2. poi fare un aggiornamento Model (.EDMX) da DB (selezionare l'aggiornamento Viste)
  3. Ora sarà in grado di interrogare i dati TableB utilizzando il contesto di EF.

Se avete bisogno di modificare (Create, Update, Destroy) record nei tuoi TableB

  1. creare stored procedure nello schema, di conseguenza.

  2. importare i Procs come funzione nella Tua EF modello

  3. Ora è possibile chiamare queste funzioni dal vostro modello di contesto per il resto dei tuoi operazioni CRUD.