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

问题描述 投票:1回答:1

我使用的是ORM linq2db. 我们需要在运行时设置列名。这也是为什么我不能使用 POCO级 而使用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中一样?

在英孚 Core 3.x中,这看起来像这样:有没有可能像在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)但当我在属性上迭代时,我不知道如何在不使用这个Expression(memberGetter)的情况下选择正确的属性(PropertyMappingBuilder),也不知道如何在foreach中设置这个Expression。有没有像这样的字符串重载 .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);    
}

欢迎提供任何想法! 谢谢:): Any Ideas welcome!

c# orm mapping fluent linq2db
1个回答
1
投票

你需要手动生成合适的LambdaExpression,用于 Parameter() 方法。

var param = Expression.Parameter(typeof(Addresses));
adressenBuilder.Property(Expression.Lambda<Func<Addresses, object>>(
    Expression.Convert(Expression.Field(param, fieldInfo), typeof(object)),
    param))...
© www.soinside.com 2019 - 2024. All rights reserved.