Come puoi vedere qui sotto, c'è una tabella di ricerca per i valori enum e voglio creare una relazione tra i valori di enum di una tabella e la colonna LookupKey della tabella di ricerca (invece della colonna ID della tabella di ricerca).
Tabella di ricerca:
ID | LookupType | LookupKey | LookupValue |
101 | Status | 0 | Passive |
106 | Gender | 1 | Male |
113 | Status | 1 | Active |
114 | Gender | 2 | Female |
118 | Status | 2 | Cancelled |
Tabella principale:
ID | Status | Gender | Name | ...
1 | 0 | 1 | John Smith | ...
2 | 1 | 2 | Christof Jahnsen | ...
3 | 2 | 1 | Alexi Tenesis | ...
4 | 0 | 2 | Jurgen Fechtner | ...
5 | 1 | 2 | Andreas Folk | ...
Tuttavia, quando si utilizza la relazione PK-FK e InverseProperty come su DataAnnotations - InverseProperty Attribute, la relazione viene creata con la colonna ID della tabella di ricerca e non è possibile creare la relazione con la colonna LookupKey. Potresti fare un esempio su come raggiungere questo obiettivo?
Abbiamo una tabella di ricerca comune qui. Sembra similare al tuo. LookupData ha una chiave primaria e una chiave esterna per LookupTypes che è equivalente all'enumerazione e al valore. Potremmo anche avere altri campi semplici come un flag o un codice che sono identificati nella tabella dei metadati LookupType. Quindi nella tabella principale out potremmo avere "GenderLookupId" che punta al campo LookupData.Id. Gli ID stessi non hanno alcun significato e possono essere inseriti in qualsiasi ordine. Se vuoi che il genere 1 e 2 abbiano un significato, dovresti probabilmente aggiungere un altro attributo per questo (vedi le chiavi sostitutive).
Esempio con dati:
LookupType
ID Description CodeDesc BooleanDesc
1 Genders Gender Code NULL
2 Races Race Code Is Active
LookupData
ID LookupTypeId Description Code Boolean
789 1 Male M NULL
790 2 White W True
791 1 Female F NULL
792 2 Hispanic H False
Main Name Table
NameId Name GenderLookupId RaceLookupId
1234 Joe Smith 789 790
1235 Mary Meyers 791 792
Classi:
public class LookupType
{
public int Id { get; set; }
public string Description { get; set; }
public string CodeDescription { get; set; }
public string BooleanDescription { get; set; }
}
public class LookupData
{
public int Id { get; set; }
public int LookupTypeId { get; set; }
public string Description { get; set; }
public string Code { get; set; }
public bool? BooleanValue { get; set; }
public LookupType LookupType { get; set; }
}
public class Name
{
public int Id { get; set; }
public string FullName { get; set; }
public int? GenderLookupId { get; set; }
public LookupData Gender { get; set; }
}
LookupData Config:
HasRequired(p => p.LookupType).WithMany(p=>p.LookupData).HasForeignKey(p=>p.LookupTypeId).WillCascadeOnDelete(false);
Nome configurazione:
HasOptional(p => p.Gender).WithMany(p=>p.Name).HasForeignKey(p=>p.GenderLookupId).WillCascadeOnDelete(false);