linq2db 如何迭代 Fluent Mapping 中的属性?

linq2db how to iterate over Properties in Fluent Mapping?

我正在使用 ORM linq2db
我们需要在运行时设置列名。 这就是为什么我不能使用 POCO-Class 中的属性而是使用 Fluent Mapping Api 的原因(据我所知没有记录) .

因为列名将在运行时确定,所以我想遍历我的实体中的所有属性并设置 Columnname.

在 EF Core 3.x 中看起来像这样:

foreach (var property in modelBuilder.Model.GetEntityTypes()
        .SelectMany(t => t.GetProperties()))
{
   property.SetColumnname(columnNameDict[property.Name]);
}

是否有可能像在 EF Core 中一样遍历模型中的所有属性?

linq2db 中设置 属性 的属性我必须使用这样的代码:

builder
    .Entity<Addresses>()
    .HasTableName("ADDRESSES")
    .Property(x => x.Company) // This is the Membergetter, which i can't use in a foreach afaik.
    .HasColumnName("TEXT1")

要访问 属性 ID,我必须使用 "x => x.ID"(Expression<Func<Addresses, object>> memberGetter),但是当我遍历属性时,我不知道如何 select 正确的 属性 (属性MappingBuilder) 而不使用此表达式 (memberGetter) 或如何在 foreach 中设置此表达式。有没有像这样的字符串重载.Property("Company")?我没找到。

我用反射试了一下,但是表达式部分没有用;):

foreach (var property in typeof(Addresses).GetProperties())
{
    var fieldInfo = adressenInfo.GetFieldByUser(property.Name);
    adressenBuilder.Property(a => property.GetValue(a)) // this line doesn't work
                   .HasColumnName(fieldInfo.LogicalName)
                   .HasDbType(fieldInfo.DataBaseType);    
}

欢迎任何想法!谢谢:)

您需要为 Parameter() 方法手动生成正确的 LambdaExpression。

var param = Expression.Parameter(typeof(Addresses));
adressenBuilder.Property(Expression.Lambda<Func<Addresses, object>>(
    Expression.Convert(Expression.Field(param, fieldInfo), typeof(object)),
    param))...