我使用的是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!
你需要手动生成合适的LambdaExpression,用于 Parameter()
方法。
var param = Expression.Parameter(typeof(Addresses));
adressenBuilder.Property(Expression.Lambda<Func<Addresses, object>>(
Expression.Convert(Expression.Field(param, fieldInfo), typeof(object)),
param))...