Sto cercando di mappare le entità dinamicamente in EF Core. Quindi, invece di avere più relazioni specificate esplicitamente nel dbcontext, sto provando a farlo con la riflessione. Quindi ho questo fino ad ora:
var props = modelBuilder.Model.GetEntityTypes()
.SelectMany(t => t.GetProperties())
.Where(p => p.IsForeignKey());
foreach (var prop in props)
{
var name = prop.Name.Split(new[] { "Id" }, StringSplitOptions.None)[0];
var parentTableType = prop.DeclaringEntityType.ClrType
.GetFields(BindingFlags.Instance | BindingFlags.NonPublic)
.Where(f => f.FieldType != typeof(long))
.First(f => f.Name.Contains(name))
.FieldType;
var childTableType = prop.DeclaringEntityType.ClrType
.GetFields(BindingFlags.Instance | BindingFlags.NonPublic)
.Where(f => f.FieldType == typeof(long))
.First(f => f.Name.Contains("Id"))
.DeclaringType;
}
Quindi funziona come mi aspetto, sto ottenendo il Type
di ciascuna delle tabelle. Ora il problema sta arrivando quando cerco di creare effettivamente la relazione. Le Type
delle due tabelle sono ovviamente variabili, quindi non posso usarle come Type
esplicite come segue:
modelBuilder.Entity<parentTableType>()
.HasMany<childTableType>();
Esiste comunque la possibilità di convertire le variabili in Tipi concreti in fase di runtime per consentire il verificarsi di quanto sopra o sto sprecando il mio tempo cercando di farlo?
Esistono molti overload di metodi non generici dell'API Fluent che accettano il nome del tipo di string
o gli argomenti del tipo Type
.
Dal momento che hai variabili di Type
, puoi utilizzare i sovraccarichi di Entity
e HasMany
corrispondenti:
modelBuilder.Entity(parentTableType)
.HasMany(childTableType);