【问题标题】:Entity Framework code first, set column name on a Boolean property首先是实体框架代码,在布尔属性上设置列名
【发布时间】:2014-08-14 19:41:57
【问题描述】:

我正在尝试使用反射在布尔属性上设置列名。 这适用于标准 String、Int 等,但没有采用 Expression<Func<Object,Boolean>> 的 Property 方法

基本上就是这个modelBuilder.Entity<Object>().Property(g => g.boolDeleted).HasColumnName("BooleanColumn");

ParameterExpression parameter = Expression.Parameter(entityObject, "t");
var expressionProperty = Expression.Property(parameter, propertyInfo.Name);

const string methodSignature = "System.Linq.Expressions.Expression`1[TDelegate] Lambda[TDelegate]" + "(System.Linq.Expressions.Expression, System.Linq.Expressions.ParameterExpression[])";
var generatedLambdaMethod = typeof(Expression).GetMethods()
.Single(mi => mi.ToString() == methodSignature);

var func = typeof(Func<,>).MakeGenericType(new[] { entityObject, typeof(Boolean) });

var genericLambda = generatedLambdaMethod.MakeGenericMethod(func);

var generatedLambdaInvoked = genericLambda.Invoke(null,
new object[] { expressionProperty, new[] { parameter } });

var method = modelBuilder.GetType().GetMethod("Entity");

var genericMethod = method.MakeGenericMethod(new[] { entityObject })
    .Invoke(modelBuilder, new object[] { });

var propertyMethod = genericMethod.GetType()
    .GetMethods()
    .Where(m => m.Name == "Property" && m.GetParameters().Where(p => p.ParameterType == generatedLambdaInvoked .GetType()).Any() == true)
    .Single();

var propInvoked = propertyMethod.Invoke(genericMethod, new[] { generatedLambdaInvoked });                       


var hasColumnNameInvoked = propInvoked.GetType()
    .GetMethods()
    .Where(m => m.Name == "HasColumnName")
    .First()
    .Invoke(propInvoked, new object[] { "BooleanColumn" });

如何设置此列的名称? EF 可以读取该列,所以这不可能。

【问题讨论】:

    标签: c# .net entity-framework reflection ef-code-first


    【解决方案1】:
    var propertyMethods = genericMethod.GetType()
        .GetMethods()
        .Where(m => m.Name == "Property" && m.IsGenericMethodDefinition)
        .First()
        .MakeGenericMethod(new[] { typeof(Boolean) });
    

    我希望这对将来的某人有所帮助,方法Property() 有一个可选的通用构造函数。如果有nullable boolean就会出现问题

    这就是我所做的。

    var propertyMethods = genericMethod.GetType()
        .GetMethods()
        .Where(m => m.Name == "Property" && m.IsGenericMethodDefinition)
        .ToList();
    
    if (Nullable.GetUnderlyingType(typeof(Boolean?)) != null)
    {
        propertyMethod = propertyMethods.ElementAt(1)
            .MakeGenericMethod(new[] { Nullable.GetUnderlyingType(typeof(Boolean?)) });
    
    }
    else
    {
        propertyMethod = propertyMethods.ElementAt(0)
            .MakeGenericMethod(new[] { typeof(Boolean) });
    }
    

    所以实际上你调用了采用 Nullable 的泛型方法,但你使用不可空类型创建了泛型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 2011-08-29
      • 2011-07-29
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多