2

我正在使用 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),但是当我遍历属性时,我不知道如何在不使用此表达式(memberGetter)的情况下选择正确的属性(PropertyMappingBuilder)或如何在 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);    
}

欢迎任何想法!谢谢 :)

4

1 回答 1

3

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

var param = Expression.Parameter(typeof(Addresses));
adressenBuilder.Property(Expression.Lambda<Func<Addresses, object>>(
    Expression.Convert(Expression.Field(param, fieldInfo), typeof(object)),
    param))...
于 2020-05-13T08:37:27.003 回答