2012-04-10 9 views
10

Ho un tipo di entità chiamata Immagine che eredita dalla Pubblicazione (ci sono altri 5 tipi di Pubblicazioni, tutte condividono 10 proprietà comuni).suddivisione tabella di un tipo di entità ereditata?

Sfortunatamente, la tabella Immagine nel mio DB include 4 colonne binarie con i dati per 4 versioni dell'immagine a risoluzioni diverse, quindi ci sono 4 proprietà del tipo di immagine EF: BinOriginal, BinHiRes, BinLowRes, BinThumbnail, che contengono quantità molto elevate di dati.

Ciò influisce sulle prestazioni. Ad esempio, non voglio prendere tutti i dati binari quando sto solo creando una serie di link di immagini.

Così ho cercato di ping-splitting, ponendo i 4 campi binari in una nuova entità ImageFile a la: http://blogs.msdn.com/b/adonet/archive/2008/12/05/table-splitting-mapping-multiple-entity-types-to-the-same-table.aspx

ho assicurato la corretta tabella di mappatura, ha aggiunto l'associazione 1-1 e comprendeva la vincolo referenziale, ma sto ottenendo questo errore:

Error 3033: Problem in mapping fragments starting at line 2731:EntitySets 
'ImageFiles' and 'Publications' are both mapped to table 'Images'. Their primary 
keys may collide. 

... sembra che ci sia un problema in quanto la tabella di essere divisa è coinvolto in una relazione di ereditarietà.

Ho provato ereditare il nuovo tipo di ImageFile EF dalla pubblicazione, ma poi ho un errore:

Problem in mapping fragments starting at lines 2332, 2374:Two entities with 
different keys are mapped to the same row 

DOMANDA Esiste un modo per aggirare questo, o se il fatto che ho bisogno l'Immagine Il tipo EF da ereditare da Publication preclude la divisione degli altri campi in un nuovo tipo?

+1

È possibile modificare lo schema del database? Cioè creare una tabella separata per le immagini? –

+0

Sì: questo è quello che ho fatto ora come un "work-around" (in realtà è un progetto di DB migliore, ma era molto più lavoro dato che il DB è già in produzione). La mia domanda sulla divisione del tavolo è ancora valida - è ancora un aspetto di EF che voglio capire. Se è possibile verificare/documentare che non è possibile dividere una tabella che è un sottotipo in una relazione di ereditarietà, sarà sufficiente accettare una risposta. – Faust

+0

OK, capito, ma non sono sicuro se approfondirò questo :). –

risposta

1

Si può considerare questa una limitazione di Entity Framework: esistono in realtà due parti, il modello dell'elemento del database sottostante e l'entità creata dal modello. La sottoclasse dell'Entità non ha alcun effetto sul Modello.

Se non si desidera caricare tutti i dati per una riga del modello, del progetto è:

var results = from product in myDB.Products 
       where product.Id == productId 
       select New 
       { 
        Id = product.Id, 
        Name = product.Name, 
        ImageUrl = product.ImageUrl 
       }; 

La query SQL che Entity Framework crea solo seleziona le colonne nella clausola select del Query LINQ.

Ciò consente inoltre a Entity Framework di memorizzare la riga della tabella nell'oggetto ObjectContext (o DBContext per EF 5).

Come nota a margine, sarei tentato personalmente di archiviare dati binari di grandi dimensioni in una soluzione NoSQL e di mantenere da solo la chiave associata nel database SQL.

Problemi correlati