Posso solo rispondere per la seconda parte della tua domanda: "Inoltre ... perché non c'è un ObjectSet per" Fondi "nel mio DataContext (cioè, container.Funds)?"
È normale che ObjectContext abbia solo un ObjectSet della classe base nella gerarchia di classi. Non c'è davvero bisogno di un ObjectSet delle classi derivate. Per aggiungere ed eliminare oggetti derivati a/da ObjectContext, è sufficiente utilizzare i metodi AddObject
e di ObjectSet<BaseEntity>
/BaseEntities
come già fatto nell'esempio.
Per eseguire query sugli oggetti derivati è possibile utilizzare il metodo OfType
di ObjectSet. Esso restituisce un ObjectQuery del tipo derivato dove si può costruire ulteriori domande su:.
ObjectQuery<Fund> query = container.BaseEntities.OfType<Fund>();
(La prima parte della tua domanda suona come un errore di mapping tra lo stoccaggio e il modello concettuale che potrebbe avere una migliore cif voi potrebbe mostrare le parti rilevanti del file edmx)
Edit:. Possibile soluzione alla prima parte della domanda:
ho creato il vostro esempio con il modello-prima in VS2010 e ho potuto riprodurre la vostra problema. Il problema sembra essere correlato al fatto che la chiave primaria del modello non è uno Int32
ma uno Guid
. Quando si aggiunge una nuova entità al modello, il progettista propone sempre una chiave primaria Int32
con StoreGeneratedPattern
impostata su Identity
.
Se si cambia ora il tipo di chiave nel modello progettista Int32
-Guid
ma lascia la StoreGeneratedPattern
immutata essendo Identity
, il DDL crea un database in SQL Server con Id
set di digitare uniqueidentifier
ma identità specifica per quella colonna è "No".
Quindi, quando EF invia un comando INSERT al DB, "pensa" dalla definizione del modello, il primario verrà generato automaticamente nel DB e non invia il Guid al DB che è stato assegnato nel codice. Ma il DB non crea la chiave, risultando in un valore NULL per la chiave. Da qui l'errore che otteniamo.
Soluzione: impostare nel modello di progettazione per la proprietà Id
di BaseEntity
da StoreGeneratedPattern
a None
. Per me ha funzionato allora. Naturalmente, si è quindi responsabili di assegnare sempre una guida a Id
prima di aggiungere un nuovo oggetto all'ObjectSet, ma sembra essere quello che si desidera comunque.
Che cos'è "HybridModelContainer'? Pubblica uno screenshot dei dettagli di mappatura per la tua entità 'Fondo'. –
Questo è solo il nome di DataContext. – SolarX
@SolarX: Potresti per favore pubblicare lo screenshot che ho menzionato? –