【问题标题】:Use Entity Framework's StructuralTypeConfiguration.Ignore() to Ignore all properties but specified set使用实体框架的 StructuralTypeConfiguration.Ignore() 忽略除指定集之外的所有属性
【发布时间】:2012-03-06 14:09:20
【问题描述】:

在 EF CodeFirst Fluent API 中,我可以编写如下内容:

modelBuilder.Entity<MyEntity>()
            .Ignore(e => e.Property1);
modelBuilder.Entity<MyEntity>()
            .Ignore(e => e.Property2);

如何忽略除一小部分之外的所有属性,如下所示:

modelBuilder.Entity<MyEntity>()
            .IgnoreAllBut(e => e.ID, e => e.Important);

是否可以编写像IgnoreAllBut这样的扩展方法?

【问题讨论】:

  • 是的,可以使用反射和调用忽略。这不是 fluent API 开箱即用的支持。您是否需要有关如何使用 Reflection 进行此操作的更详细帮助?
  • 我会很感激帮助,因为当我用Expression.Property() 构造属性表达式并尝试在Ignore() 中使用它时,我得到:The type arguments for method cannot be inferred from the usage. Try specifying the type arguments explicitly.
  • 将此表达式问题添加为新问题:stackoverflow.com/questions/9621736/…

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


【解决方案1】:

这是草稿,但有效:

public static void IgnoreAllBut<TStructuralType>(
    this StructuralTypeConfiguration<TStructuralType> configuration,
    params Expression<Func<TStructuralType, object>>[] includes)
    where TStructuralType : class
{
    var includeMembers = ConvertExpressionsToMembers(includes);
    var type = typeof(TStructuralType);
    var properties = type.GetProperties();
    var typeParameter = Expression.Parameter(type);
    var configurationType = configuration.GetType();
    var ignoreMethod = configurationType.GetMethod("Ignore");
    foreach (var property in properties)
    {
        if (!includeMembers.Any(member => member.Name == property.Name))
        {
            var propertyExpression = Expression.Property(typeParameter, property);
            var lambdaExpression = Expression.Lambda(propertyExpression, typeParameter);
            var genericIgnoreMethod = ignoreMethod.MakeGenericMethod(property.PropertyType);
            var parameters = new object[] { lambdaExpression };
            genericIgnoreMethod.Invoke(configuration, parameters);
        }
    }
}

private static List<MemberInfo> ConvertExpressionsToMembers<TStructuralType>(
    Expression<Func<TStructuralType, object>>[] expressions)
{
    var members = new List<MemberInfo>();
    foreach (var lambda in expressions)
    {
        var expression = lambda.Body;
        var memberExpression = expression as MemberExpression;
        if (memberExpression == null)
        {
            var unaryExpression = expression as UnaryExpression;
            memberExpression = unaryExpression.Operand as MemberExpression;
        }
        members.Add(memberExpression.Member);
    }
    return members;
}

感谢 DarkGray 提供链接 question 中的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 2023-01-27
    • 2014-07-17
    相关资源
    最近更新 更多