2009-03-19 14 views

risposta

6

La soluzione era creare una tabella separata con il campo varbinary e fare 1-a-1 relazione tra le tabelle

+0

Non sempre possibile su uno schema esistente, ma probabilmente l'approccio più semplice quando è possibile. L'ho fatto, con una chiave esterna nella tabella "secondaria" nella mia "tabella principale", controllando se FK è nullo o non permette di sapere se e se un record "secondario" esiste senza doverlo effettivamente caricare. – AFract

1

Un modo potrebbe essere quello di proiettare la vostra set di risultati in un tipo anonimo, quando non è necessario il blob:

from entity in context.Entities 
select new 
{ 
    Field1 = entity.Field1, 
    Field2 = entity.Field2 
} 

In questo esempio, solo Field1 e Campo2 verranno caricati.

Questo metodo ha lo svantaggio che non è possibile aggiornare l'istanza restituita e fare context.SaveChanges. Anche se direi che salvare un'istanza senza la piena conoscenza dell'istanza è borderline non sicura. Questo metodo è utile quando si desidera un lungo elenco di restituire le istanze, ma verrà eseguita una query per una singola istanza, il campo varbinary e tutto, prima di aggiornare effettivamente.

+0

Grazie per l'assistenza. Stavo cercando qualcosa di simile al caricamento lazy del campo varbinary :) ma sembra che questo non sia possibile. – Emil

4

Non è necessariamente creare tabella separata. Dovresti fare diversi passaggi. Supponiamo di avere una tabella "Documenti" (Id, Nome, Dati (varbinary)).

  1. Aprire EF designer, copiare e incollare l'entità 'Documento'.
  2. Rinominarlo in "DocumentData". Aggiungi mappatura alla tabella 'Documenti'.
  3. Elimina la proprietà "Dati" nell'entità "Documento".
  4. Elimina la proprietà 'Nome' nell'entità 'DocumentData'.
  5. Fare clic con il tasto destro del mouse sull'entità 'DocumentData' e aggiungere una nuova associazione. Seleziona l'associazione 1-a-1 con l'entità 'Documento'.
  6. Selezionare una nuova associazione, andare su Proprietà, fare clic su '...' nel campo 'Limite referenziale', selezionare l'entità 'Documento' come principale, lasciare tutto come predefinito (Id -> Id) e fare clic su OK.

Ora costruire il progetto.

NOTA. Ora, quando si crea nuova entità 'documento' si dovrebbe anche creare nuova entità 'DocumentData', anche se non si desidera inserire ancora dati:

Document doc = new Document(); 

doc.Name = "My document"; 
doc.DocumentData = new DocumentData(); 

context.Documents.Add(doc); 
context.SaveChanges(); 
0

Tabella splitting. Lo strumento Entity Developer consente di eseguire ciò visivamente. Puoi mappare la tua entità per diverse tabelle.

1

È necessario rimuovere il campo varbinary dalla tabella e inserirlo in un'altra tabella, creando una relazione uno a uno tra quelli. Questa è una buona pratica perché puoi facilmente implementare il caricamento lazy e altre cose ..

Problemi correlati