C# 类型上的EF核心实体
我正在尝试在EF Core中动态映射实体。因此,我没有在dbcontext中显式地指定多个关系,而是尝试使用反射来实现它。因此,到目前为止,我有以下几点: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
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中所做的那样。上面的操作与手动反射相同。哦,我明白你的意思。好的,这是一个比我做的简单得多的解决方案。真不敢相信我居然没想到。非常感谢你,伊万!不客气。我将把第一部分删除为不相关,只留下具体的答案