Tabela por herança hierarquia com entidades POCO em Entity Framework 4
-
13-09-2019 - |
Pergunta
A nossa organização está olhando para padronizar Entity Framework, uma vez v4 sai. Como resultado, eu estou olhando para o que seria necessário para migrar nosso aplicativo que usa NHibernate para persistência para EF4 usando o suporte POCO. Em um par de lugares que usar herança única tabela (também conhecido como tabela por hierarquia). Eu fui incapaz de obtê-lo para o trabalho usando o seguinte.
Pagamento (classe base [deve ser abstrato, mas tendo problemas lá também]) CreditCardPayment (implementação concreta) ACHPayment (implementação concreta) CheckPayment (implementação concreta)
Agora, eu estou mapeando-os apenas com as propriedades da classe base. Todas essas classes estão no mesmo namespace. Eles têm uma discrimimator que é chamado PaymentTypeId no banco de dados, então o mapeamento de pagamento tem uma condição de "Quando PaymentTypeId = 0". Cada uma das subclasses possuem a mesma condição com valores diferentes (isto é CreditCardPayment = 1, etc.).
Quando tento carregar cada uma lista de todos os pagamentos usando DataContext.Payments.ToList () (herda DataContext de ObjectContext) Estou recebendo a seguinte exceção:
"mapeamento objeto não pôde ser encontrado para o tipo com a identidade 'DataLayer.DataModel.CreditCardPayment'."
Eu não consigo descobrir o que isso significa, como a classe POCO CreditCardPayment mora no mesmo namespace como a classe POCO pagamento faz (na verdade no mesmo arquivo).
O que eu estou ausente?
Solução 2
O que eu não representam antes (eu não acho que relevante, mas foi). Era que CreditCardPayment herdada de uma classe intermediária chamada "PagamentoACrédito" e ACHPayment herdada de CashPayment. CreditCardPayment e CashPayment viver no mesmo espaço e arquivo, mas não estavam representados no mapeamento EF. Uma vez eu adicionei aqueles dentro do arquivo de mapeamento, tudo funcionou ok.
Assim, mesmo pensou EF não é nunca mapear para um desses tipos diretamente, parece necessidade de saber sobre eles, porque muda a BaseType das classes CreditCardPayment et al. Obrigado por sua ajuda sobre isso.
Outras dicas
Este está reclamando não sobre o mapeamento de banco de dados, mas o modelo de mapeamento CLR.
A EF não pode, por algum motivo encontrar sua classe CreditCardPayment
.
Agora, uma possível razão é que você não tenha carregado os metadados para isso ainda.
Por exemplo, se você tem o seguinte:
Assembly 1:
- Payment
Assembly 2 references Assembly 1:
- CreditCardPayment extends Payment
Então, quando você consulta o EF não sabe onde CreditCardPayment vive.
A maneira de contornar este problema é com LoadAssembly ou seja:
using (DataContext ctx = new DataContext())
{
ctx.MetadataWorkspace.LoadFromAssembly(typeof(CreditCardPayment).Assembly);
// now do your query.
}
Você precisa dizer a LoadFromAssembly
toda assembléia que não é referência diretamente por sua classe DataContext
.
Nota:. typeof(Payment).Assembly
está diretamente referenciada por causa da propriedade Pagamentos IQueryable<Payment>
Espero que isso ajude
Alex
Microsoft.