C# 类型上的EF核心实体

C# 类型上的EF核心实体,c#,entity-framework-core,C#,Entity Framework Core,我正在尝试在EF Core中动态映射实体。因此,我没有在dbcontext中显式地指定多个关系,而是尝试使用反射来实现它。因此,到目前为止,我有以下几点: var props = modelBuilder.Model.GetEntityTypes() .SelectMany(t => t.GetProperties()) .Where(p => p.IsForeignKey()); foreach (var prop in props

我正在尝试在EF Core中动态映射实体。因此,我没有在dbcontext中显式地指定多个关系,而是尝试使用反射来实现它。因此,到目前为止,我有以下几点:

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;
}
所以这是我所期望的,我得到了每个表的
类型。现在问题来了,当我试图真正建立关系。两个表的
类型
显然是变量,因此我不能将它们用作显式
类型
,如下所示:

modelBuilder.Entity<parentTableType>()
    .HasMany<childTableType>();
modelBuilder.Entity()
.HasMany();
是否在运行时将变量转换为具体类型以允许发生上述情况,还是我在浪费时间尝试这样做?

有许多Fluent API非泛型方法重载接受
string
类型名称或
类型
类型参数

由于您有
类型
变量,因此可以使用相应的
实体
,并且
有许多
重载:

modelBuilder.Entity(parentTableType)
    .HasMany(childTableType);  

我遇到的问题是,即使发现了外键,在删除实体时它也不会级联删除。这就是为什么这些关系是手动定义的,现在是使用反射来定义的。无论如何,重要的部分是EF Core提供了一套丰富的非通用API,这几乎消除了反射的需要,就像您在gist中所做的那样。上面的操作与手动反射相同。哦,我明白你的意思。好的,这是一个比我做的简单得多的解决方案。真不敢相信我居然没想到。非常感谢你,伊万!不客气。我将把第一部分删除为不相关,只留下具体的答案