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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top