Pergunta

Eu tenho o seguinte esquema no banco de dados:

  • BillingReferences (ReferencingType tinyint , ReferencingId tinyint , ReferencedType tinyint , ReferencedId tinyint , IsActive pouco .) - onde todos os campos (exceto IsActive) fazem parte de um índice exclusivo
  • BillingType (BillingTypeId tinyint , nome varchar (50) )

ReferencingType e ReferencedType é uma chave estrangeira de BillingTypes. BillingTypes contém as seguintes linhas:

BillingTypeId | Nome

1 | Etiquetas

2 | Países

3 | PaymentProviders

4 | PaymentOptions

5 | Bancos

ReferecingId e ReferencedId representar o Id de uma das seguintes entidades (depende do tipo referenciado / referenciamento):

  • Banks (BankID tinyint , nome varchar (50) )
  • Países (CountryId tinyint , nome varchar (50) )
  • Etiquetas (labelId tinyint , nome varchar (50) )
  • PaymentProviders (PaymentProviderId tinyint , nome varchar (50) )
  • PaymentOptions (PaymentOptionId tinyint , nome varchar (50) )

No futuro cada entidade terá algumas colunas mais diferentes adicionado mas por agora este é o esquema para simplificar.

Há uma conexão de (1- ) entre cada entidade (com excepção dos países) para os países. Rótulos têm uma conexão de (1 - ) para Bancos, PaymentProviders e PaymentOptions. E PaymentProviders ter uma conexão de (1- *) para PaymentProviders

Por exemplo, se eu quiser conectar um banco com BankID 201 para um país com CountryId 3003 Vou ter um registro em BillingReferences que vai ficar assim: ReferencingType = 5 ReferencingId = 201 ReferencedType = 2 ReferencedId = 3003 IsActive = 1

Nós não fazer uma tabela de conexão / de referência para cada tipo de conexão por causa da consideração extendability - Se queremos adicionar outra entidade todos nós temos que fazer é adicionar sua tabela e adicionar registros para ele em BillingReferences e BillingType <. / p>

O problema é que eu não posso configurar uma condicional de chave estrangeira entre BillingReferences e cada uma das entidades e eu não consigo configure / mapeá-lo com EntityFramework ou ...

eu era incapaz de encontrar qualquer tutorial ou exemplo que usa este tipo de implementação. Am I obrigado a criar uma tabela de referência para cada conexão, ou se existe uma maneira de configurar isso com EntityFramework?

Obrigado pela ajuda:)

Foi útil?

Solução

AFAIK, há não é uma maneira de fazer isso.

Eu iria com a criação de uma tabela separada para cada tipo, a menos que você realmente tem uma boa razão para não. A consideração que você menciona não é uma boa, IMHO.

Tendo mais tabelas lhe permite colocar restrições de chave estrangeira em suas chaves, e isso se traduz muito bem na EF. Ele também ajuda o desempenho:. A sua tabela de referência bunda grande com um milhão de linhas vai demorar mais tempo para consulta de tabelas mais pequenos (menos que você queira sempre todas as referências para um tipo)

Outras dicas

Não só não há maneira de fazer isso no Entity Framework, não há nenhuma maneira de fazer isso em SQL, tampouco. Você não pode ter uma chave estrangeira que referências uma das cinco tabelas diferentes.

O que eu acho que você deve fazer é em vez de ter um pai, tipo de referência abstrato, e fazer os tipos de concreto subtipos deste tipo pai. Agora você tem apenas uma chave estrangeira, a uma mesa. Você pode escolher tabela por tipo ou mapeamento de tabela por hierarquia. Dado que você não tem quaisquer colunas especiais em tudo em qualquer um dos tipos que você mencionou, eu acho que rel tabela por hierarquia mapeamento seria uma melhor escolha para você

.

A única maneira que você poderia realizar o que você queria é construir um gatilho para lidar com o processamento no lado do servidor. Você não pode mapear FK é assim para várias tabelas. Mas um gatilho pode lidar com essa lógica. É claro que seria totalmente fora EF ...

Eu também recomendo que você construir uma tabela separada para cada tipo. Simples de manter, a longo prazo, eu acho.

Bem, eu acho que eu sou sugestão vai utilizador do Inferis e criar uma tabela separada para cada tipo.

Obrigado a vocês por suas respostas - que ajudou A LOT :)

No SQL você pode criar uma exibição para cada tipo com base em uma única tabela. Cada vista pode executar junta para recuperar informações relacionadas com apenas esse tipo. Isso também permite que você acha dos links como um todo ignorando seu tipo.

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