Domanda

La nostra organizzazione sta cercando di standardizzare su Entity Framework volta v4 viene fuori. Di conseguenza, sto guardando che cosa ci vorrebbe per migrare la nostra applicazione che utilizza NHibernate per la persistenza di EF4 utilizzando il supporto POCO. In un paio di posti che usiamo l'ereditarietà singola tabella (noto anche come tabella per gerarchia). Sono stato in grado di farlo funzionare utilizzando il seguente.

Il pagamento (classe base [dovrebbe essere astratto, ma avendo difficoltà anche lì]) CreditCardPayment (concreta attuazione) ACHPayment (concreta attuazione) CheckPayment (concreta)

In questo momento, sto li mappatura con solo le proprietà della classe base. Tutte queste classi sono nello stesso namespace. Hanno un discrimimator che si chiama PaymentTypeId nel database, in modo che il mapping di pagamento ha una condizione di "Quando PaymentTypeId = 0". Ciascuna delle sottoclassi hanno la stessa condizione con valori diversi (cioè CreditCardPayment = 1, ecc.).

Quando provo a caricare ogni un elenco di tutti i pagamenti utilizzando DataContext.Payments.ToList () (DataContext eredita da ObjectContext) Sto ottenendo il seguente eccezione:

"mappatura oggetto non è stato trovato per il tipo con l'identità 'DataLayer.DataModel.CreditCardPayment'."

Non riesco a capire che cosa questo significa, come la classe POCO CreditCardPayment abita nello stesso spazio dei nomi della classe di pagamento POCO fa (in realtà nello stesso file).

Che cosa mi manca?

È stato utile?

Soluzione 2

Quello che non rappresento prima (non ho pensato rilevante, ma era). Era che CreditCardPayment ereditato da una classe intermedia denominata "CreditPayment" e ACHPayment ereditato da CashPayment. CreditCardPayment e CashPayment vivono nello stesso spazio dei nomi e file, ma non sono stati rappresentati nella mappatura EF. Una volta ho aggiunto quelli all'interno del file di mapping, tutto ha funzionato bene.

Quindi, anche pensato EF non mai la mappa di uno di quei tipi direttamente, sembra avere bisogno di sapere su di loro, perché cambia la BaseType delle classi CreditCardPayment et al. Grazie per il vostro aiuto su questo.

Altri suggerimenti

Questo si lamenta non si tratta di mappatura di database, ma il modello di mappatura CLR.

L'obiettivo EF non può per qualche ragione trovare la vostra classe CreditCardPayment.

Ora, una possibile ragione è che non hai ancora caricato i metadati per esso.

Per esempio, se si dispone di questo:

Assembly 1:
 - Payment

Assembly 2 references Assembly 1:
 - CreditCardPayment extends Payment

Poi, quando si esegue una query l'EF non sa dove abita CreditCardPayment.

Il modo per aggirare il problema è con LoadAssembly cioè:

using (DataContext ctx = new DataContext())
{
   ctx.MetadataWorkspace.LoadFromAssembly(typeof(CreditCardPayment).Assembly);

   // now do your query.

}

Dovete dire a LoadFromAssembly ogni assemblea, che non è il riferimento direttamente dalla classe DataContext.

Nota:. typeof(Payment).Assembly è direttamente riferimento a causa della proprietà IQueryable<Payment> Pagamenti

Spero che questo aiuti

Alex

Microsoft.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top