EF Core实体类型问题

3

我正在尝试在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;
}

所以这正如我所预期的那样工作,我正在获得每个表的Type。现在问题是当我尝试实际创建关系时出现问题。两个表的Type显然是变量,因此我不能像下面一样使用它们作为显式的Type

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

有没有办法在运行时将变量转换为具体类型,以允许上述情况发生,或者我试图做这件事是在浪费时间?
1个回答

2

有许多流利的API 非泛型方法重载,接受string类型名称或Type类型参数。

既然您有Type变量,您可以使用相应的EntityHasMany重载:

最初的回答:

有许多 Fluent API 非泛型方法重载,可以接受 string 类型的名称或 Type 类型的参数。如果您拥有 Type 变量,则可以使用相应的 Entity 和 HasMany 重载。

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

我遇到的问题是,即使发现了外键,当删除实体时它也不会级联删除。因此,关系现在已经通过反射手动定义和定义。 - Tachyon
无论如何,重要的是EF Core提供了一组丰富的非泛型API,几乎消除了您在gist中所做的反射需求。上述代码也可以不需要手动反射实现相同的功能。 - Ivan Stoev
1
哦,我明白你的意思了。好的,这比我做的要简单得多。我简直不敢相信我没想到。非常感谢你,伊万! - Tachyon
1
不用谢。我将删除第一部分,只留下具体的答案。 - Ivan Stoev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接