2010-05-18 11 views
5

Sto migrando una vecchia applicazione ASP in una versione .NET moderna, per ridurre i tempi di sviluppo che stiamo esaminando in .NET 4.0 Entity Framework. Tuttavia, sembra che abbiamo colpito un muro di mattoni nel nostro sviluppo con questo problema.Problema di implementazione della gerarchia di tabelle ed ereditarietà

Dato è una piccola parte del nostro database: Una tabella OBJECT che contiene un elenco di automobili e le loro rispettive proprietà. Abbiamo anche una tabella OBJECT_OPTIONS che contiene, per una determinata auto in OBJECT, un elenco di OPZIONI, ACCESSORI e ATTREZZATURE STANDARD. Questi tre tipi hanno tutti gli stessi campi e sono quindi memorizzati nella stessa tabella. La colonna ncopt_type viene utilizzata per discriminare tra i diversi elenchi. I valori possibili sono: "opt", "acc" e "sta". La tabella OBJECT_OPTIONS si collega a OBJECT tramite ncopt_obj_id che rappresenta un'automobile unica (obj_id) nella tabella OBJECT.

Il nostro obiettivo è quello di fornire l'entità OBJECT con 3 proprietà che puntano a diverse liste OBJECT_OPTIONS: - opzioni di proprietà - ACCESSORI proprietà - proprietà STANDARDEQUIPMENT

Abbiamo provato diversi tutorial e procedure dettagliate concernenti la tavola -per-gerarchia tramite il modello di ereditarietà ma non è riuscito a creare un modello costruibile.

Tecnicamente quello che abbiamo fatto è stato:

  • Creare entità OGGETTO
  • Crea entità OBJECT_OPTIONS, renderlo astratto
  • Aggiungere entità OPZIONE, accessorio e STANDARD_EQUIP tutti utilizzando OBJECT_OPTIONS BaseType
  • Aggiungi condizioni a tutti tre tabelle su ncopt_type = '...'
  • Aggiungi 3 proprietà di navigazione a OBJECT, il tutto collegato a una delle entità ereditate: OPZIONI, ACCESSORI e STAND AARD_EQUIPMENT

Un mazzo di errori mostra durante questa configurazione, ma si finisce con questo:

Errore 3032: Problema in frammenti mappatura partire dalle linee 250, 286: EntityTypes NCO.Model. OPZIONE, NCO.Model.ACCESSOIRE, NCO.Model.STANDAARD_EQUIP vengono mappati alle stesse righe nella tabella OBJECT_OPTIES. Le condizioni di mappatura possono essere utilizzate per distinguere le righe a cui sono mappati questi tipi.

C'è una condizione presente su tutti e tre gli oggetti.

Non ho trovato alcuna soluzione a questo problema e ho già trascorso troppo tempo. Attualmente stiamo usando un metodo di soluzione alternativa, ma mi piacerebbe che venisse risolto questo problema poiché questa situazione si presenterà qualche altra volta entro la fine del progetto.

Qualsiasi aiuto apprezzato, se avete bisogno di ulteriori informazioni, per favore lasciatemi un commento o un'email.

+1

Quindi, ehm, non si sa? –

+0

Non sembrerebbe. Ho lo stesso problema, ... forse siamo solo noi due! – Stimul8d

+0

È possibile allegare un'immagine delle tabelle pertinenti e delle entità rilevanti da edmx? - Aiuterebbe a chiarire quello che stai cercando di fare. Lascia un commento qui dopo la modifica. –

risposta

1

Non sono convinto che si può fare questo al 100% dalla finestra di progettazione EF, ma si può fare in questo modo:

  1. Crea entità OBJECT (ho rinominato questo 'veicolo' per l'esempio)
  2. Creare entità OBJECT_OPTIONS, rendono astratta
  3. Aggiungi entità OPZIONE, accessorio e STANDARD_EQUIP tutto utilizzando BaseType OBJECT_OPTIONS
  4. Aggiungi condizioni per tutti e tre i tavoli sulla ncopt_type = '...'

poi aggiungere le proprietà desiderate utilizzare una classe parziale per veicolo:

using System.Collections.Generic; 
using System.Linq; 

public partial class Vehicle 
{ 
    public IEnumerable<ACCESSORY> Accessories 
    { 
     get { return this.OBJECT_OPTIONS.OfType<ACCESSORY>(); } 
    } 

    public IEnumerable<OPTION> Options 
    { 
     get { return this.OBJECT_OPTIONS.OfType<OPTION>(); } 
    } 

    public IEnumerable<STANDARD_EQUIP> StandardEquipments 
    { 
     get { return this.OBJECT_OPTIONS.OfType<STANDARD_EQUIP>(); } 
    } 
} 
+0

Ciao Steve, abbiamo abbandonato questo metodo dopo che ci è voluto molto per capire. Potremmo riprenderlo in una versione futura. Quando lo faremo proverò con la tua soluzione. Per ora sembra che la tua soluzione possa funzionare, quindi la contrassegnerò come accettata. Grazie per aver dedicato del tempo per rispondere a questo. –

+0

Nessun problema :) –

Problemi correlati