Entity Framework Unione di tabelle con relazioni a chiave esterna a distanza

1

Non sono sicuro se "Ranged Foreign Key Relationship" è un termine reale o se ho appena inventato, ma questo è quello di cui sto parlando:

Tabella gruppo età

int MinAge { get; set; }
int MaxAge { get; set; }
string Description { get; set; }

Tabella clienti

public int CustomerID { get; set; }
public string Name { get; set; }'
public int Age { get; set; }
public virtual AgeGroup AgeGroup { get; set; }

Viste le due tabelle precedenti, come posso unirmi a loro usando (EntityFramework, DataAnnontations, DbContext) e poter accedere a Customer.AgeGroup.Description ?

Considera i seguenti dati di esempio:

Fascia d'età

MinAge MaxAge Description
0      12     Youngin
13     19     Teenager
20     29     Twenties
30     39     Thirties
40     9999   Old

Clienti

CustomerID Name        Age
345        Joe Smith   17
493        Cobaltikus  31
631        Jane Doe    29

Come posso metterli in relazione? Cobaltikus ha un'età di 31 anni. Non esiste un record AgeGroup corrispondente con 31. Il record AgeGroup corrispondente è quello con MinAge = 30 e MaxAge = 39. Posso farlo facilmente in SQL, ma come si fa con EntityFramework?

SELECT
  AgeGroup.Description

FROM
  Customer,
  AgeGroup

WHERE
  Customer.CustomerID = 493
  AND AgeGroup.MinAge <= Customer.Age
  AND AgeGroup.MaxAge >= Customer.Age
    
posta Cobaltikus 07.08.2012 - 17:56
fonte

2 risposte

1

La tabella AgeGroup non deve essere connessa alla tabella Customer tramite una chiave esterna o un costrutto di Entity Framework.

La tabella AgeGroup è in effetti una tabella di ricerca, ma la ricerca dovrebbe avvenire in runtime , non in fase di compilazione.

Dovresti aggiungere del codice personalizzato al tuo modello tramite una classe parziale; e incapsula questa ricerca all'interno di una proprietà o di un metodo "Ottieni".

Ecco alcuni esempi di codice:

using System.Linq;

namespace CobaltikusProject.Models
{
    public partial class Customer
    {
        public string AgeGroup
        {
            get { return EFEntities.AgeGroups.Single(a => a.MinAge <= this.Age && this.Age <= a.MaxAge); }
        }
    }
}
    
risposta data 07.08.2012 - 20:14
fonte
0

Non esiste una "relazione a chiave straniera a distanza". Questo non è qualcosa che i database relazionali gestiscono (almeno non con chiavi esterne ).

Il modo di gestire il collegamento tra cliente e fascia di età è con una sotto-query o una query di ricerca. Non c'è modo di farlo con una proprietà di navigazione in EF. È possibile creare un metodo nel contesto dei dati basato su una stored procedure che ricerca la fascia d'età appropriata fornita da una chiave cliente. Questo sarebbe quasi altrettanto facile da usare nel tuo codice come proprietà di navigazione.

    
risposta data 07.08.2012 - 21:12
fonte

Leggi altre domande sui tag