1

我刚刚创办了一家新公司,他们很高兴我使用 CodeFirst - 但希望数据库字段采用驼峰式。

我目前正在写很多这样的东西......

    [Column("active")]
    public bool Active { get; set; }

    [Column("paymentType")]
    public string PaymentType { get; set; }

有什么方法可以将其全部设置为数据库 Camel Case,而不必装饰我的所有属性?

谢谢

4

1 回答 1

1

您可以使用代码优先自定义约定 如果使用 Fluent Api,您也可以在上下文中使用每种类型的反射。在每个 POCO 上循环,并为每个 PROPERTY 设置名称,将 char1 更改为小写。

modelBuilder.Entity<EFTestPoco>().Property(p=>p.UoM1).HasColumnName("camelCase");

编辑: 反射挑战包括动态 lambda ......直到你问我没有意识到循环需要动态 lambda ......我的嘴张得太宽了 :-)

...这是我使用的代码片段的剪切和粘贴。...我使用 EASIER /System.Linq.Dynamic 方法

您可以使用 Expression Complication 库System.Linq.Expressions 或者您可以使用更易于使用的 Dynamic Lambda 库 来构建动态 Linq 语句。
所以这里是示例代码

  // inside your context on model creating
  //....   
 // repeat for each poco.  // or reflect on thr context if feeling lazy and intellectual
 var entity = new EntityTypeConfiguration<Poco>;
// Get the properties of a poco
    foreach (var propInfo in typeof(T).GetProperties()) {
            SetCamelCase<T>(propInfo,entity);
        }
 modelBuilder.Configurations.Add(entity);
 ....
 } // end of ON model creating



private static void SetCamelCase<TModelPoco>(PropertyInfo propertyInfo, 
                             EntityTypeConfiguration<TModelPoco> entity) where TModelPoco : BaseObject {

        var camel = propertyInfo.Name.Substring(0, 1).ToLower() + propertyInfo.Name.Substring(1);

        switch (propertyInfo.UnderLyingType().Name) {
            case SystemDataTypeConstants.String :
            var propLambdaString = System.Linq.Dynamic.DynamicExpression.ParseLambda<TModelPoco, string >(propertyInfo.Name);
            entity.Property(propLambdaString).HasColumnName(camel);
            break;
            case SystemDataTypeConstants.Int32:
            var propLambdaInt =System.Linq.Dynamic.DynamicExpression.ParseLambda<TModelPoco, int >(propertyInfo.Name);
            entity.Property(propLambdaInt).HasColumnName(camel);
                break;
           //  SystemDataTypeConstants. // and teh rest you may use...
        }


    }
    public static Type UnderLyingType(this PropertyInfo propertyInfo) {
        return Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType;
    }
于 2013-05-15T11:28:17.493 回答